.NET Core 2.0 - 仍然看到No' Access-Control-Allow-Origin'标头错误

时间:2018-06-19 00:44:22

标签: c# asp.net .net asp.net-web-api asp.net-core

我知道这个结束了。我已经研究了类似问题的其他答案,如果没有运气的话。

我相当确定我已正确启用CORS以允许来自所有来源的传入请求(在本例中为POST请求),但我看到以下错误:

  

无法加载http://localhost:5000/expenses:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:4200'因此是不允许的   访问。响应的HTTP状态代码为500。

以下是我在webAPI项目中启用CORS的方法:

Startup.cs中的相关方法

 // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors();
            services.AddMvc();

            services.AddDbContext<ExpensesDbContext>(options =>
                                                    options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IBaseDa<Accounts>, AccountsDataAccess>();
            services.AddTransient<IExpensesDa, ExpensesDa>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            env.EnvironmentName = "Development";

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

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

            app.UseMvc();
        }

如果我正在使用.AllowAnyOrigin().AllowAnyMethod(),为什么我会看到上述错误?

3 个答案:

答案 0 :(得分:1)

netCore2.0(http://localhost:5000/)+ Angular(http://localhost:4200)+ chrome = Access-Control-Allow-Origin的组合。我之前遇到过这个问题,我花了3天时间才意识到chrome总会抛出这个错误。我认为这是因为chrome将localhost视为无视端口的起源,即使中间件明确地告诉它不要特别关于POST请求。

我会尝试在startup.cs中定义一个策略配置服务:

  public void ConfigureServices(IServiceCollection services)
        {
  //add cors service
            services.AddCors(options => options.AddPolicy("Cors",
                builder =>
                {
                    builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                }));

然后在你的Configure方法中我会添加:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //authentication added 
            app.UseAuthentication();

            app.UseCors("Cors");
            app.UseMvc();
        }

...这很可能不会工作,但尝试任何人....这让我疯了,我需要满意的看看请求是否甚至试图打到asp.netCore后端: 我用了

如果你真的想看到我会清除你的缓存和cookie然后添加 IHttpContextAccessor可以对请求中发生的事情进行低级控制。 在我遇到同样问题的困境中,我需要角度来发送图像。我正在接受这种感觉 原因错误然后通过exprimenting我通过将IHttpContextAccessor注入我的控制器获得了Image

调试

public void ConfigureServices(IServiceCollection services)
{
  //add cors service
                services.AddCors(options => options.AddPolicy("Cors",
                    builder =>
                    {
                        builder.AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader();
                    }));

    services.AddMvc();

         // register an IHttpContextAccessor so we can access the current
            // HttpContext in services by injecting it
            //---we use to this pull out the contents of the request

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

你想将它注入任何控制器

用于检索POST请求的json对象。我将把这个例子用作家庭控制器:

public class HomeController : Controller
    {

        // make a read only field
        private readonly IHttpContextAccessor _httpContextAccessor;

    //create ctor for controller and inject it
    public UserService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    // now in your post method use this to see what the if anything came in through the request:
    public async Task<IActionResult> Picload(IFormFile file){//---always null

    // in my problem I was loading and image from.
    var file =  _httpContextAccessor.HttpContext.Request.Form.Files[0];
}

使用它,它让我访问图像chrome给我一个Origin错误。

答案 1 :(得分:1)

在这种情况下我挠了一段时间。我已正确启用了CORS,但某些调用仍返回Access-Control-Allow-Origin错误。我发现了问题...偷偷摸摸的问题...

我们的问题是由我们如何使用app.UseExceptionHandler引起的。具体来说,这是我们正在使用的代码,除了我们的原始代码没有context.Response.Headers.Add("Access-Control-Allow-Origin", "*");行。

app.UseExceptionHandler(errorApp =>
{
    errorApp.Run(async context =>
    {
        var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
        var exception = errorFeature.Error;

        var problemDetails = new ProblemDetails
        {
            Title = R.ErrorUnexpected,
            Status = status,
            Detail =
              $"{exception.Message} {exception.InnerException?.Message}"
        };

        context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        context.Response.StatusCode = problemDetails.Status.GetValueOrDefault();
        context.Response.WriteJson(problemDetails, "application/problem+json");

        await Task.CompletedTask;
    });
});

app.UseExceptionHandler是比控制器操作低得多的功能,因此不参与与本机相关的任何CORS。添加context.Response.Headers.Add("Access-Control-Allow-Origin", "*");可以解决此问题。

答案 2 :(得分:0)

我的水晶球告诉我,您的C#代码中的某个位置在执行时出现错误,因此该服务的“返回”语句永远不会执行。因此,请调试代码并修复错误,以便将响应返回到浏览器。