允许任何来源的CORS不起作用:Axios Vuejs。

4

我有一台服务器已经设置好了,正在生产环境中运行,我们有很多应用程序调用这个Web服务器。下面的代码是为了演示它允许任何来源的请求。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseExceptionHandler("/Home/Error");

        app.UseStaticFiles();

        app.UseCors(builder =>
        {
            builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
        });

这适用于当前所有已设置的服务器。它在我们内部网络中,其他内部服务器将使用此服务。

我正在创建一个概念验证,尝试通过使用Vue逐步现代化我们的应用程序。但这个axios请求出现了错误。调用此方法的其他服务器也使用.NET,但应该构建相同的请求。

以下是错误信息。

加载 https://{server}/api/application/36626 失败:请求资源上未提供 'Access-Control-Allow-Origin' 标头。因此,不允许来源为 'http://localhost:8080' 的访问。

显然这是axios在说废话。我允许任何来源。我不能想象我们只想使用'simple-requests',因此简单请求的w3标准可能不起作用。 我想也许这是一个错误的错误,考虑到这是从服务器返回的octet-stream。下面是代码。

<script>
import axios from 'axios'

export default {
  name: 'AppList',
  data () {
    return {
      applist: [],
      errors: []
    }
  },
  created: function() {
    axios.get('https://{server}/api/application/36626')
      .then(r => { console.log(response); })
      .catch(ex => {
        this.errors.push(ex);
      })
  }
}
</script>

编辑:我对这台机器拥有完全的权限,并确认我可以在本地机器上使用Postman GET请求而没有任何问题。

编辑2:有效的curl命令curl -X GET --header 'Accept: application/octet-stream' 'https://{server}/api/Application/36626'


请使用https://www.test-cors.org/测试您的服务器。 - akatakritos
@akatakritos 它在我们的内部网络上,无法在我们的网络之外使用。 - christopher clark
你的 axios 调用看起来没问题,所以我怀疑你的服务器配置。 - akatakritos
Postman不关心CORS。CORS是浏览器实现的安全机制。如果服务器没有说“嘿,你的主机名可以与我通信”,那么浏览器就会拒绝发出请求。Postman毫不在意。 - akatakritos
您的服务器配置似乎是正确的。我不确定为什么它不起作用。https://learn.microsoft.com/zh-cn/aspnet/core/security/cors - akatakritos
显示剩余7条评论
2个回答

7

事实证明,.Net Core服务器没有正确设置,直到我尝试在本地机器上使用浏览器时才出现了问题。

我不确定CORS实现是否改变了,我是否没有意识到,或者一开始就做错了,但我确信我遵循了指南。

我所做的第一件事是确保在配置应用程序使用之前添加了Cors策略。

接下来我做的第二件事(我认为这是可选的,但最佳实践),也将策略逻辑移动到了方法中。

我的最终代码如下所示。我尽量保持原样以保留顺序。

 public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });
            services.AddOptions();
            services.AddSwaggerGen();
            ///Authentication configuration went here.
            services.AddSingleton<IConfiguration>(Configuration);
            services.AddMvc();

        }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseExceptionHandler("/Home/Error");
        app.UseStaticFiles();
        app.UseCors("CorsPolicy");

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

        app.UseSwagger((httpRequest, swaggerDoc) =>
        {
            swaggerDoc.Host = httpRequest.Host.Value;

        });
        app.UseSwaggerUi(swaggerUrl: "/{appname}/swagger/v1/swagger.json");

1
不可能同时设置AnyOrigin()和AnyCredentials()。 - dskibin

1
“激活CORS对于PUT和DELETE方法对我来说没有起作用,我的解决方法是在web.config文件中添加一些配置行以删除WebDav模块。”
“我将其添加到现有的system.webServer标记中。”
<modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
</modules>

我在这个网站上找到了以下内容:

修改 web.config 文件 https://hovercraft.ie/asp-net-core-web-api-put-delete-methods-not-allowed-405-error/

希望这可以帮到你。


请在您的答案中发布可工作的代码,而不仅仅是指向外部链接。 - Pedro Gaspar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接