为啥在 Web API 中启用 CORS 时收到 OPTIONS 请求?
Posted
技术标签:
【中文标题】为啥在 Web API 中启用 CORS 时收到 OPTIONS 请求?【英文标题】:Why am I getting an OPTIONS request when I enabled CORS in Web API?为什么在 Web API 中启用 CORS 时收到 OPTIONS 请求? 【发布时间】:2019-07-10 06:14:49 【问题描述】:我有一个使用 Angular Framework 和 Asp.net Core 的项目。
在我的 ConfigureServices 中,我有以下代码:
services.AddCors(options =>
options.AddPolicy(
"CorsPolicy",
builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
);
然后配置如下:
app.UseCors("CorsPolicy");
app.UseMvc();
然后在 BaseApiController
中添加 EnbaleCors 属性[EnableCors("CorsPolicy")]
public class BaseApiController : Controller
在 Angular 中添加如下:
return this.http
.post(url, body, headers: headers, withCredentials: true )
.map((response: Response) =>
return response as any;
)
当我运行应用程序时,我在网络中有 2 个请求,其中一个请求方法:OPTIONS 状态代码:204 No Content 和其他在我的请求中。
我的问题在哪里?
感谢您抽出宝贵时间分享您的想法
【问题讨论】:
【参考方案1】:没问题,不用担心。
出于安全原因,浏览器会限制跨域 HTTP 请求 从脚本中启动。例如,
XMLHttpRequest
和 Fetch API 遵循同源策略。这意味着网络 使用这些 API 的应用程序只能从 加载应用程序的来源相同,除非响应来自 另一个来源包括正确的 CORS 标头。
OPTIONS
请求只是对跨源之间安全网络调用的安全检查。因此,当您发出这样的请求时,客户端将向同一地址发送OPTIONS
请求,以确保发送原始请求是安全的(GET
/POST
)。
【讨论】:
@arcreezy 谢谢,我可以在生产中禁用或隐藏此 OPTIONS 请求吗? @SaeidMirzaei 如果客户端和服务器位于不同的域中,我认为您不能禁止客户端发送 CORS 请求。通过将您的请求的 Content-Type 更改为application/x-www-form-urlencoded
或 multipart/form-data
或 text/plain
可能会有解决方法,但我不鼓励这样做。
我没有任何不同的域,我有两个子域,例如“api.my-doamin.com”和“client.my-doamin.com”。这种情况可以吗?
@SaeidMirzaei 我对不同域的意思是您的客户端和服务器,而不是 URL。正如我所说,它不会引起任何问题。以上是关于为啥在 Web API 中启用 CORS 时收到 OPTIONS 请求?的主要内容,如果未能解决你的问题,请参考以下文章
即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求
当 OPTIONS 请求的 statusCode 为 200 时,为啥我会在 API Gateway GET 请求中收到 CORS 错误?