为什么我的 POST 请求在部署时被 CORS 阻止但它在本地工作
Why are my POST requests blocked by CORS when deployed but it works locally
我有一个 Angular 9 前端和一个 VB.NET Web API 2 后端。
当 运行 都在本地时它工作正常,但是当它们被部署时所有 POST 请求都被 CORS 阻止。
(GET 工作正常,尽管这似乎只是因为它们没有触发预检,因此 CORS 不相关。如果我在这个假设上有误,请纠正我!)
前端位于 mydomain.com,后端位于 api.mydomain.com 的子域上。
它们都托管在同一台服务器上(Godaddy 共享 Windows 托管,IIS 8 通过 Plesk)
我的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).
如果我在浏览器开发工具的“网络”选项卡中检查 headers,请求中的“来源”header 与“access-control-allow-origin”header 在响应中。
为什么这不起作用,即使允许的原点设置为“*”? (改变这将是下一个有趣的问题......)
这似乎是一个常见问题,因为我已经阅读了无数 SA 问题和其他文章,但仍然找不到缺少的内容!
我又通读了一遍 one of the threads 我在之前的评论中提到的答案。
基本上从 web.config
中删除这一行:
<remove name="OPTIONSVerbHandler" />
我曾多次看到这个被提到 add 以使其工作,因为它默认存在于我的文件中,所以我从未接触过它。
据我了解,这会告诉 IIS 是处理选项请求还是将其留给您的代码。
我有一个 Angular 9 前端和一个 VB.NET Web API 2 后端。
当 运行 都在本地时它工作正常,但是当它们被部署时所有 POST 请求都被 CORS 阻止。 (GET 工作正常,尽管这似乎只是因为它们没有触发预检,因此 CORS 不相关。如果我在这个假设上有误,请纠正我!)
前端位于 mydomain.com,后端位于 api.mydomain.com 的子域上。 它们都托管在同一台服务器上(Godaddy 共享 Windows 托管,IIS 8 通过 Plesk)
我的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).
如果我在浏览器开发工具的“网络”选项卡中检查 headers,请求中的“来源”header 与“access-control-allow-origin”header 在响应中。
为什么这不起作用,即使允许的原点设置为“*”? (改变这将是下一个有趣的问题......)
这似乎是一个常见问题,因为我已经阅读了无数 SA 问题和其他文章,但仍然找不到缺少的内容!
我又通读了一遍 one of the threads 我在之前的评论中提到的答案。
基本上从 web.config
中删除这一行:
<remove name="OPTIONSVerbHandler" />
我曾多次看到这个被提到 add 以使其工作,因为它默认存在于我的文件中,所以我从未接触过它。
据我了解,这会告诉 IIS 是处理选项请求还是将其留给您的代码。