OPTIONS 405(方法不允许)即使服务器发送Access-Control-Allow-Methods:OPTIONS,GET,HEAD,POST

12

我正在尝试进行跨域请求,我的服务器已经配置好发送以下标头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:x-requested-with, Authorization
Access-Control-Allow-Methods:OPTIONS, GET, HEAD, POST
Access-Control-Allow-Origin:*

但当发出OPTION请求时,我会收到OPTIONS 405 (Method Not Allowed)错误。

有什么想法是什么问题以及如何解决?


可能是Access-Control-Allow-Origin Multiple Origin Domains?的重复问题。 - kenorb
3个回答

10

我建议两种解决方案:

1)如果您正在使用WebAPI,则需要实现选项方法,其约定应如下所示:

public class XXXController : ApiController
{
    // OPTION http-verb handler
    public string OptionsXXX()
    {
        return null; // HTTP 200 response with empty body
    }

    ...
}

2) 如果您未使用WebAPI,请尝试理解代码的哪一部分会触发 OPTION 调用时出现的 OPTIONS 405 (Method Not Allowed) 错误。在这种情况下,我建议检查是否尝试将这些 <customHeaders/> 添加到 Web.config 文件中:

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!-- CORS temporary solution -->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With" />
        <add name="Access-Control-Allow-Methods" value="OPTIONS, TRACE, GET, HEAD, POST, PUT" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

7
您的网络服务器/应用程序可能已配置为针对每个HTTP GET动词和POST动词请求发送上述响应标头。但是,您的Web服务器是否配置为处理HTTP OPTIONS动词?
如果您需要更多详细信息,请提供您正在使用的Web服务器和应用程序编程技术。
简单介绍一下,当浏览器具有某些自定义请求标头的跨域请求时,它们将发送OPTIONS请求。在实际请求之前进行此请求。仅当此请求返回您提到的响应标头时,浏览器才会进行实际请求。
//这些OPTIONS请求被称为预检请求--通常浏览器开发工具不会在其网络选项卡中跟踪它们。

1
谢谢您的评论。服务器是IIS 7。我该如何配置它来处理OPTIONS? - Spadar Shut
听起来是个不错的方向。你能否提供一些关于如何处理“HTTP Options”动词的推荐链接? - Blaise
1
@Blaise 处理选项动词的最简短解释可以在 https://dev59.com/9WYr5IYBdhLWcg3wg6X9#13646169 上找到 - 关于如何在web api < 2和asp.net mvc中进行更多详细信息,请查看 http://www.codeguru.com/csharp/.net/net_asp/using-cross-origin-resource-sharing-cors-in-asp.net-web-api.html 。对于Web API 2,请查看 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api。 - humblelistener
1
这条最后的评论终于解决了我的WebAPI 2问题:Install-Package Microsoft.AspNet.WebApi.Cors和httpEnableConfig.EnableCors()。 - pauldendulk

1
你需要修改默认的OPTIONSVerbHandler。如果使用asp classic,这意味着需要将以下代码添加到Web.config文件中:
    <handlers>
        <remove name="OPTIONSVerbHandler" />
        <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />
    </handlers>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接