使用 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 服务器上运行