CORS 错误仅适用于一个控制器

Posted

技术标签:

【中文标题】CORS 错误仅适用于一个控制器【英文标题】:CORS error working only for one controller 【发布时间】:2020-06-02 06:14:14 【问题描述】:

我正在开发一个 dotnet core web api。

我的 API 托管在 localhost:44366 我的客户端应用程序托管在http://127.0.0.1:5501/(使用 vs code 实时服务器)

我正在使用提交按钮发出两个 POST 请求 以前我在发出 一个 POST 请求时遇到以下问题:

Access to XMLHttpRequest at 'https://localhost:44366/api/surveycreatoroptions' from origin 
'http://127.0.0.1:5501' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is 
present on the requested resource.

我在两个控制器上都尝试了 [EnableCors("AllowMyOrigin")] 方法。

它适用于第一个请求,但不适用于第二个请求(给出相同的错误)

这是我用于启用 CORS 的内容

 services.AddCors(options =>
            
            options.AddPolicy("AllowMyOrigin",
             builder => builder.WithOrigins("http://127.0.0.1:5501").AllowAnyMethod().AllowAnyHeader())
             ;
            );

        

我怎样才能使它适用于这两个请求。

【问题讨论】:

你能在 Startup.cs 的 Configure 和 ConfigureServices() 中显示你的代码吗? 【参考方案1】:

您可以在 ConfigureServices 方法中使用以下代码

services.AddCors(options =>

            options.AddPolicy("CorsPolicy",
            builder => builder.AllowAnyOrigin()
                                .AllowAnyMethod()
                                .AllowAnyHeader()
                                .AllowCredentials());
);

并在配置方法中使用

app.UseCors("CorsPolicy");

【讨论】:

【参考方案2】:

我遇到了你的问题。为了解决这个问题,首先将此代码添加到 startup.cs

public void ConfigureServices(IServiceCollection services)

     services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
     
      builder.AllowAnyMethod()
             .AllowAnyHeader()
             .AllowAnyOrigin()
             .AllowCredentials();
        ));
        services.Configure<MvcOptions>(options =>
        
            options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
        );
  

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, DiagnosticListener diagnosticListenerSource, DiagnosticObserver diagnosticObserver)
 
        app.UseCors("MyPolicy");
 

那么“Access-Control-Allow-Origin”应该添加到api发送请求头中。

打字稿示例:

fetch(window.appSettings.API_URL + path, 
        redirect: 'follow',
        method,
        body: data === null ? null : JSON.stringify(data),
        headers: 
            Accept: 'application/json',
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',
            Authorization: 'Bearer ' + bToken,
        ,
    );

出于安全考虑,您可以更改来源

【讨论】:

【参考方案3】:

试试这个代码,看看它是否适合你

public void ConfigureServices(IServiceCollection services)

      services.AddCors();
      services.AddMvc();


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

    app.UseCors(
        options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()
    );

    app.UseMvc();

【讨论】:

以上是关于CORS 错误仅适用于一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

Cloudfront CORS 仅适用于子域

对象 addSubview 仅适用于 viewDidLoad

UIScrollView 是不是仅适用于嵌入在导航控件中的视图控制器?

titleView 仅适用于一个视图控制器(self.navigationController 为 nil)

Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)

带有表格视图的视图仅适用于默认视图控制器