为啥在 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-urlencodedmultipart/form-datatext/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 错误?

为啥我的 API 中没有启用 CORS?

404 for web.api cors 选项

在 Azure 上为 .NET Web Api 启用 CORS

使用凭据启用 Cors .web api core 1.1