CORS 405不允许的方法(CORS 405 Method Not Allowed)

2019-07-22 20:31发布

我一直在关注的Mozilla文章就如何建立自己的网站,允许跨站点脚本的请求 。 使用IIS管理器中我已经加入了以下HTTP响应头

Access-Control-Allow-Origin  : *
Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS

尽管我不断收到一个405 Method Not Allowed时,我的浏览器(Firefox和Chrome)发送一个定制的飞行前的请求SecurityPrivateKeyID头。

请求

OPTIONS /Service/Json/User.svc/ HTTP/1.1
Host: serviceprovider.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://client.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: securityprivatekeyid
Connection: keep-alive

响应

HTTP/1.1 405 Method Not Allowed
Allow: GET
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/8.0
access-control-allow-origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Origin, SecurityPrivateKeyID
Date: Sat, 23 Mar 2013 08:35:03 GMT

在直接访问时,服务工作正常http://serviceprovider.com/Service/Json/User.svc/

什么我做错了任何想法?

[注意我已经改变了我的主机文件指向client.com和serviceprovider.com在我的机器]

[使用JSONP不会做我的网络服务必须能够消耗POST的解决方案,PUT和DELETE methos]

Answer 1:

我的IIS 8实例是全新安装,看来我需要做一些修改Handler Mappings

备份IIS配置

在任何的sugggested变化打破现有的网站时,最好使ApplicationHost.config文件的备份

  1. 导航到C:\Windows\System32\inetsrv\config
  2. 制作副本applicationhost.config

删除未使用的处理程序

作为一个起点,我删除了所有未使用的处理程序映射,以减少问题的空间。 您可以通过修改做到这一点applicationhost.config直接或通过使用IIS管理器

  1. 打开IIS管理器
  2. 无论是服务器节点或个别网站节点上选择处理程序映射功能
  3. 手动删除你不需要的所有映射。

我的网站是基于大量的服务,仅仅依靠静态文件和文件中.aspx.svc文件扩展名。 我也手动删除所有引用.NET 2.0在整个配置文件。

添加选项处理程序

这似乎是修复。

  1. 打开IIS管理器
  2. 无论是服务器节点或个别网站节点上选择处理程序映射功能
  3. 在左手列中选择Add Module Mapping
  4. Add Module Mapping对话框中使用下列值。
    • Request path - *
    • Module - ProtocolSupportModule
    • Executable - [留空]
    • Name - [您想要的任何]
  5. 点击Request Restrictions
    • Mapping选项卡,unckeck Invoke handler only if request is mapped to
    • Verbs标签确保OPTIONS选择
    • Access选项卡中选择Script

我得到的处理程序配置看起来是这样的

<handlers accessPolicy="Read, Script">
    <add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />
    <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>


Answer 2:

对于我的实例:

  1. 确保“访问控制 - 允许 - 头”和“访问控制允许的方法”的要求是比响应小于或等于(不要使用“*”)

  2. 删除此行<remove name="OPTIONSVerbHandler" /> Web.config中



Answer 3:

在我来说,我不得不去Handler Mappings ,切换到Ordered View ,然后将OPTIONSVerbHandler一路到列表的顶部。



文章来源: CORS 405 Method Not Allowed
标签: cors iis-8