11

我一直在关注关于如何设置我的网站以允许跨站点脚本请求的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 的解决方案不行,因为我的 Web 服务必须能够使用 POST、PUT 和 DELETE 方法]

4

3 回答 3

23

我的 IIS 8 实例是全新安装的,看来我需要对Handler Mappings

备份 IIS 配置

如果任何建议的更改破坏了您现有的网站,最好备份 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选项卡中,取消选中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>
于 2013-03-24T13:26:49.267 回答
1

对于我的例子:

  1. 确保请求中的“Access-Control-Allow-Headers”和“Access-Control-Allow-Methods”小于或等于响应中的。(不要使用“*”)

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

于 2016-09-28T08:02:34.483 回答
0

在我的情况下,我必须去Handler Mappings,切换到Ordered View,然后OPTIONSVerbHandler一直移动到列表的顶部。

于 2019-04-25T23:12:49.777 回答