不允许使用CORS 405方法

不允许使用CORS 405方法,cors,iis-8,Cors,Iis 8,我一直在关注如何设置我的网站以允许跨站点脚本请求。我使用IIS管理器添加了以下HTTP响应头 Access-Control-Allow-Origin : * Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS 尽管如此,当我的浏览器(Firefox和Chrome)用一个自定义的SecurityPriv

我一直在关注如何设置我的网站以允许跨站点脚本请求。我使用IIS管理器添加了以下HTTP响应头

Access-Control-Allow-Origin  : *
Access-Control-Allow-Headers : Origin, SecurityPrivateKeyID
Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS
尽管如此,当我的浏览器(Firefox和Chrome)用一个自定义的
SecurityPrivateKeyID
头发送飞行前请求时,我仍然得到一个
405方法,这是不允许的

请求

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/

你知道我做错了什么吗

[注意:我已将主机文件更改为我机器上的point client.com和serviceprovider.com]


[使用JSONP的解决方案不行,因为我的web服务必须能够使用POST、PUT和DELETE方法]

我的IIS 8实例是新安装的,似乎我需要对
处理程序映射进行一些修改

备份IIS配置 如果建议的任何更改破坏了现有网站,最好备份applicationhost.config文件

  • 导航到
    C:\Windows\System32\inetsrv\config
  • 复制一份
    applicationhost.config
  • 删除未使用的处理程序 作为起点,我删除了所有未使用的处理程序映射以减少问题空间。您可以通过直接修改
    applicationhost.config
    或使用IIS管理器来完成此操作

  • 打开IIS管理器
  • 在服务器节点或单个网站节点上,选择处理程序映射功能
  • 手动删除所有不需要的映射
  • 我的网站主要基于服务,只依赖静态文件和扩展名为
    .aspx
    .svc
    的文件。我还手动删除了整个配置文件中对
    .NET2.0
    的所有引用

    添加选项处理程序 这似乎是解决办法

  • 打开IIS管理器
  • 在服务器节点或单个网站节点上,选择处理程序映射功能
  • 在左侧列中选择
    添加模块映射
  • 在“添加模块映射”对话框中,使用以下值。
    • 请求路径
      -
      *
    • 模块
      -
      协议支持模块
    • 可执行文件
      -[留空]
    • Name
      -[随便你要什么]
  • 单击请求限制
    • 映射
      选项卡中,仅当请求映射到
  • 动词
    选项卡中,确保选择了
    选项
  • 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>
    
    
    
    对于我的实例:

  • 确保请求中的“访问控制允许标头”和“访问控制允许方法”小于或等于响应中的值。(不要使用“*”)

  • 删除Web.config中的此行


  • 在我的例子中,我必须转到
    处理程序映射
    ,切换到
    有序视图
    ,然后将
    选项VerbHandler
    一直移动到列表的顶部。

    您使用的是jquery ajax吗?@Floradu88否,使用XMLHttpRequest的标准javascript然后这可能会有所帮助:或者这是:在动词部分,您说选择所有动词,但在配置文件中,动词被设置为选项,正确的选项是什么?@Paleta我不再有权访问配置,但请假设xml配置是正确的。希望有人能纠正我的答案。@Paleta似乎xml将动词限制为
    OPTIONS
    是正确的。当我们将其设置为文本中所述的
    所有动词时,它只起了部分作用。@AnthonyElliott我已更改步骤5.2以匹配xml。感谢您的详细回答,但不幸的是,它对我不起作用(我使用的是IIS 7.5)。经过两天的研究,我发现避免“405方法不允许”的唯一有效解决方案是在
    应用程序_BeginRequest
    方法中定义CORS头,如本答案中所述