React + ASP.NET.Core:所请求的资源上没有“ Access-Control-Allow-Origin”标头

时间:2018-10-19 16:01:22

标签: c# reactjs asp.net-core .net-core cors

实际上,这不是重复帖子,我知道在stackoverflow社区中多次询问过的标题的一部分,我阅读了所有帖子和答案,但我认为我的问题和答案是我使用的技术是不同的。

首先我要提到ASP.NET Core WEB/API是我的后端应用程序,Reactjs是我的前端应用程序。

我了解了CORS,发现必须在CORS应用程序上启用ASP.NET并将'Access-Control-Allow-Origin':'*'放在请求的标头上,但在执行此操作时仍然出现以下错误我叫一个api:

  

请求的请求上没有'Access-Control-Allow-Origin'标头   资源。因此,不允许原点“ http://localhost:8080”   访问。响应的HTTP状态码为500。如果响应不透明   满足您的需求,将请求的模式设置为“ no-cors”以获取   禁用了CORS的资源。

这是我与Startup.cs相关的CORS代码:

public void ConfigureServices(IServiceCollection services)
{

    // other lines of code
    services.AddCors(options =>
    {
        options.AddPolicy("AllowAll",
            builder =>
            {
                builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
            });
    });

    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
    });
    // other lines of code
}

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

这是我的反应代码:

function save(message) {
    const requestOptions = {
        method: 'POST',
        mode: 'cors',
        headers: { ...authHeader(), 
            'Content-Type': 'application/json',    
            'Access-Control-Allow-Origin':'*',

    },
        body: JSON.stringify(message)               
    };
    return fetch(config.apiUrl + '/message/save', requestOptions).then(handleResponse, handleError);
}

感谢您的答复。

5 个答案:

答案 0 :(得分:9)

我最近有一个类似的问题。就我而言,当我在services.AddCors();方法和这部分代码

中添加ConfigureServices时,它开始工作
app.UseCors(builder => builder
   .AllowAnyOrigin()
   .AllowAnyMethod()
   .AllowAnyHeader()
   .AllowCredentials());

在我的Configure方法中。请记住,在两种情况下,都必须添加这些之前 UseMvc()调用。

答案 1 :(得分:4)

经过两天的苦难,我终于找到了解决问题的方法。实际上,您的评论之一对我来说是个很好的线索。

@ kirk-larkin说:

  

此处的响应具有HTTP状态代码500是关键。如果您的ASP.NET Core项目中存在异常,则会清除CORS标头。您应该尝试找出引发异常的原因。

我跟踪了很多次代码,然后发现我忘记在Startup.cs中注册我的控制器中使用的服务。

我在Startup.cs中调用了以下代码,问题得以解决。

services.AddScoped<IMessageService, MessageService>();

答案 2 :(得分:2)

对于ASP.NET Core 2.1,当控制器引发异常(导致错误500)时,将不发送CORS标头。该问题应在下一版本中修复,但在此之前,您可以使用中间件来解决此问题。

请参见

还要注意,由于大多数浏览器只是忽略了凭据,因此您需要使用凭据显式添加带有主机和端口的WithOrigins(请参见https://stackoverflow.com/a/19744754/2477619):

  app.UseCors(builder =>
    builder
      .WithOrigins("http://localhost:4200")
      .AllowAnyHeader()
      .AllowAnyMethod()
      .AllowCredentials()
  );

答案 3 :(得分:0)

制作应用程序时遇到了同样的问题。我下载了这个chrome扩展程序,问题就消失了。也许对您有帮助?

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi

答案 4 :(得分:0)

正如@Siavash 所说,它返回 500 的事实可能表明构建存在问题。我今天遇到了这个问题,因为它在本地主机上运行良好,但在部署时失败了。

要调试错误,请在 IIS 目录根目录下的 web.config 文件中找到以下行:

<aspNetCore processPath="dotnet" arguments=".\CarpetrightBackend.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />

将 stdoutLogEnabled="false" 更改为 true,然后您将能够在生成的日志文件中看到错误。

在我的情况下,我在部署时忘记包含一些静态 csv 文件,该程序需要从中引用和返回数据。