使用 CORS 在 IIS 上运行的 Angular 2 和 .net 核心 Web 应用程序之间的 HTTP 415 OPTIONS 请求

Posted

技术标签:

【中文标题】使用 CORS 在 IIS 上运行的 Angular 2 和 .net 核心 Web 应用程序之间的 HTTP 415 OPTIONS 请求【英文标题】:HTTP 415 OPTIONS request between Angular 2 and .net core web app running on IIS using CORS 【发布时间】:2017-07-31 11:15:03 【问题描述】:

我有一个在 IIS 中运行的 .net 核心 Web 应用程序 (api),被 Angular2 应用程序调用。当我在 POST 调用上设置内容类型自定义标头时,http 调用首先进行选项请求调用。 IIS(我假设)在选项调用中返回 415(不支持的媒体类型)。

我需要在 IIS(或 .net 核心)中哪里设置支持的媒体类型?

客户请求:

let postparams = 
  Action: 'DoStuff'
;
let body = JSON.stringify(postparams);

var headers = new Headers();
headers.append('Accept','application/json');
headers.append('Content-Type','application/json');
let options = new RequestOptions(headers: headers);

var url = 'http://localhost:9056/api/resolve';
var response = this.http.post(url, body, options).map(res => res.json());

Angular 生成的来自 fiddler 的选项请求(返回 415):

OPTIONS http://localhost:9056/api/resolve HTTP/1.1
Host: localhost:9056
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (Linux; android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:8100/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-GB,en;q=0.8

在 fiddler 中工作的 POST 请求(返回 200):

POST http://localhost:9056/api/resolve HTTP/1.1
Host: localhost:9056
Connection: keep-alive
Content-Length: 26
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36
content-type: application/json
Accept: */*
Referer: http://localhost:8100/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.8

"Action":"DoStuff"

如果我将内容类型设置为 text/plain,那么我会返回 415 - 我是否需要在 IIS 或 .net 核心中设置返回类型为 application/json?

提前感谢社区!

【问题讨论】:

【参考方案1】:

好的,所以我的问题最终是围绕 CORS。我通过 IIS 设置 CORS 标头,但在 .net core Startup 中设置它们解决了我的问题。不支持的媒体类型响应代码让我失望...

    public void ConfigureServices(IServiceCollection services)
    
        services.AddApplicationInsightsTelemetry(Configuration);

        // Needed to add this section, and....
        services.AddCors(options =>
        
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        );

        services.AddMvc();
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    
        // ..... this line
        app.UseCors("CorsPolicy");

        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseApplicationInsightsRequestTelemetry();

        app.UseApplicationInsightsExceptionTelemetry();

        app.UseMvc();
    

如果我可以让其他人不费吹灰之力,那么快乐的日子!

【讨论】:

无条件启用 CORS 对于生产使用来说是不安全的。考虑使用 #if DEBUG 或 IsDevelopment 或适当的 CORS 策略包装 CORS 配置以描述有效来源列表

以上是关于使用 CORS 在 IIS 上运行的 Angular 2 和 .net 核心 Web 应用程序之间的 HTTP 415 OPTIONS 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IIS 中提供静态文件(用于 CORS / OPTION 请求)?

如何在 Windows 10 的 IIS 管理器上启用 CORS?

Laravel cors 无法在 Apache 服务器上运行

在服务器端的 IIS 上使用 PHP 并在客户端使用 Angular 4 时出现 CORS 错误

如何解决 IIS 服务器上的 cors 错误

IIS 上的 Net Core Cors 和 Angular 应用程序