【发布时间】:2020-07-25 08:00:27
【问题描述】:
我正在尝试使 CORS 适用于需要预检检查的请求。在这种情况下,我使用额外的标头向后端发出 POST 请求。
角度:
let myHeaders = new HttpHeaders();
myHeaders = myHeaders.append('Content-Type', 'application/json');
return this.http.post<UserOrder>(`${this.apiURL}/Order/PlaceOrder`, JSON.stringify(payload), {headers : myHeaders}); //email);
C# API:
[HttpPost("PlaceOrder")]
public GenericResponse PlaceOrder(UserOrderInsertModel userOrder)
{
return _orderProvider.PlaceOrder(new UserOrder());
}
由于预检检查,它首先发出一个 OPTIONS 请求。当我没有在后端定义单独的选项端点时,我得到一个 405 Method Not Allowed。这让我觉得我需要一个单独的 options-endpoint 在我的后端在 post-endpoint 之上。
[HttpOptions("PlaceOrder")]
public ActionResult PlaceOrderOptions(UserOrderInsertModel userOrder)
{
return Ok();
}
添加此内容后,我遇到了 415 Unsupported Media Type(在选项调用中)。这可能是因为 HttpOptions 请求不支持 Content-Type 标头。
我觉得根本不需要额外的选项端点。我目前使用的CORS-middleware如下:
httpContext.Response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:4200");
httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
httpContext.Response.Headers.Add("Access-Control-Allow-Headers", "*");
httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
额外信息:一般来说,CORS 已经工作了。带有 GET 请求和 Access-Control-Allow-Origin 标头的跨站点脚本运行良好。只是我无法让 POST/OPTIONS 组合起作用。
编辑:在 Startup.cs 我首先尝试使用 app.UseCors() 如下:
app.UseCors();
options => options.WithOrigins("http://localhost").AllowAnyMethod()
);
不幸的是,这不起作用,所以我求助于如上所述插入中间件。
任何帮助将不胜感激!
【问题讨论】:
-
您使用的是 .Net Core 还是 .Net Framework(以及哪个版本)?
-
我使用的是 .NET Core 3.0
-
你能在中间件中设置它吗,使用
.addCors和.useCorsdocs.microsoft.com/en-us/aspnet/core/security/… ? -
预检请求应由 Web 服务器(反向代理)处理。例如,IIS 必须使用 CORS 模块,docs.microsoft.com/en-us/iis/extensions/cors-module/…
-
只是好奇,为什么这个问题被否决了?