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)错误。

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

4

3 回答 3

10

我建议2个解决方案:

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

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

    ...
}

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

<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>
于 2013-02-08T00:45:44.017 回答
7

您的 Web 服务器/应用程序可能已配置为为每个 HTTP GET 动词和 POST 动词请求发送上述响应标头。但是您的 Web 服务器是否配置为处理 HTTP OPTIONS 动词?

如果您需要更多详细信息,请提供您正在使用的网络服务器和应用程序编程技术。

一点背景知识,当您有带有一些自定义请求标头的跨域请求时,浏览器会发送一个 OPTIONS 请求。此请求在实际请求之前发出。仅当此请求返回您提到的响应标头时,浏览器才会发出实际请求。

// 这些 OPTIONS 请求称为预检请求——通常浏览器开发工具不会在其网络 tab.f 中跟踪它们

于 2012-11-08T18:03:45.910 回答
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>
于 2016-11-03T14:58:08.877 回答