为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作

Posted

技术标签:

【中文标题】为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作【英文标题】:Why are my POST requests blocked by CORS when deployed but it works locally为什么我的 POST 请求在部署时被 CORS 阻止但它在本地工作 【发布时间】:2022-01-21 11:07:57 【问题描述】:

我有一个 Angular 9 前端和一个 VB.NET Web API 2 后端。

在本地运行时,它工作正常,但是当它们部署时,所有 POST 请求都被 CORS 阻止。 (GET 工作正常,虽然这似乎只是因为它们不会触发预检检查,因此 CORS 不相关。如果我在这个假设上错了,请纠正我!)

前端位于 mydomain.com,后端位于 api.mydomain.com 的子域中。 它们都托管在同一台服务器上(Godaddy 共享 Windows 托管,通过 Plesk 的 IIS 8)

我的 web.config 中有这个:

    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, authorization" />
      </customHeaders>
    </httpProtocol>
[...]
<handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

这在 Global.asax 中:

Protected Sub Application_BeginRequest()
    If Request.Headers.AllKeys.Contains("Origin") AndAlso Request.HttpMethod = "OPTIONS" Then
        Response.Flush()
    End If
End Sub

发送 POST 请求时,我会在控制台中收到这些:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.mydomain.com/xyz. (Reason: CORS preflight response did not succeed). Status code: 405.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.mydomain.com/xyz. (Reason: CORS request did not succeed). Status code: (null).

如果我在浏览器开发工具的“网络”选项卡中检查标头,请求中的“Origin”标头与响应中的“access-control-allow-origin”标头具有相同的值。

为什么这不起作用,即使允许的来源设置为“*”? (改变这将是下一个有趣的问题......)

这似乎是一个常见问题,因为我已经阅读了无数 SA 问题和其他文章,但仍然找不到缺失的内容!

【问题讨论】:

我不确定 asp.net,但看起来您的选项调用失败而不是 post 调用。无论Response.Flush() 做什么,尝试评论它并拨打电话。如果可行,请在 Options 调用中检查您为什么这样做。 嗯,是的,选项调用失败并且不允许浏览器自己发送 post 调用。我从这里得到的那段代码:***.com/questions/27504256/…,没有它,即使在 localhost 上也不起作用。 【参考方案1】:

我在阅读了之前评论中提到的one of the threads之后找到了答案。

基本上从web.config中去掉这一行:

<remove name="OPTIONSVerbHandler" />

我曾多次看到此内容被提及为添加以使其正常工作,因为它默认存在于我的文件中,所以我从未接触过它。

据我了解,这告诉 IIS 是处理选项请求还是由您的代码决定。

【讨论】:

以上是关于为啥我的 POST 请求在部署时被 CORS 阻止但它在本地工作的主要内容,如果未能解决你的问题,请参考以下文章

当我部署我的网站时,客户端发布/获取被 CORS 阻止的请求

来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查

CORS 正在阻止 PUT、DELETE 和 POST 请求,但 GET 正在工作

Angular - 每个请求都被 CORS 阻止

角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查

从.net mvc api控制器下载角度应用程序中的文件时被CORS策略错误阻止