iss7 不允许 POST 请求的 OPTIONS 预检请求 - 如何启用?

Posted

技术标签:

【中文标题】iss7 不允许 POST 请求的 OPTIONS 预检请求 - 如何启用?【英文标题】:iss7 does not allow the OPTIONS preflight request for POST request - how to enable? 【发布时间】:2012-11-24 11:53:07 【问题描述】:

我们正在运行托管在 Windows Azure 中的 WCF 服务,并尝试从托管在其他地方的网站执行 POST 请求,但事实证明这非常棘手。显然,在 iis7 端的实际 POST 请求之前允许 OPTIONS 预检请求似乎真的很困难。

即使我们的 web.config 中有 <system.webserver> 定义

  <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Origin,X-Requested-With,Content-Type,Accept" />
        <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
      </customHeaders>
    </httpProtocol>

为了安全

<security>
  <requestFiltering>
    <verbs>
      <add verb="OPTIONS" allowed="true" />
    </verbs>
  </requestFiltering>
</security>

我们不断收到 HTTP 405 Method not Allowed 响应。

我在 *** 的不同帖子中尝试了多种技巧,但我开始感到绝望,因为似乎没有任何效果......网站在 Chrome 中工作,因为它似乎不关心预检响应,但 IE 挂在 HTTP 405响应。

有谁知道无论如何都可以允许通过 web.config 进行预检 OPTIONS 请求(以及如何),或者我们是否需要开始为预检请求实现我们自己的处理程序(如果是这样的话,一个例子会很棒:))?

谢谢, 马蒂

【问题讨论】:

【参考方案1】:

查看this thread。我认为 WebDAV 安装在 Web 角色上(虽然无法确认)。您必须 RDP 到 Web 角色实例并检查是否是这种情况。如果是,则需要创建 startup task 来删除 WebDAV。

您也可以查看this 和that 文章,了解如何通过 appcmd 或 vbscript 在 IIS 中配置动词(均可通过启动任务执行)

看来这些东西必须在应用程序主机配置级别进行配置,不允许在 web.config 级别进行。

【讨论】:

感谢 Astaykov 提供的良好链接,我们需要研究这些并开始处理 statup 任务。 一篇有很好解释和完整步骤的博文,作者:here【参考方案2】:

IIS(至少版本 7.*)肯定有预检请求处理的错误。 我使用的是经典的 asp 并将此代码添加到 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>

【讨论】:

以上是关于iss7 不允许 POST 请求的 OPTIONS 预检请求 - 如何启用?的主要内容,如果未能解决你的问题,请参考以下文章

PHP配置请求头允许跨域拦截OPTIONS请求接收POST请求参数

带有预检的 POST 请求包含允许的来源,但错误是不允许来源

ZF2中的CORS POST请求变成OPTIONS请求

请求 'OPTIONS /logout' 与 'POST /logout' 不匹配

请求 'OPTIONS /logout' 与 'POST /logout' 不匹配

nginx配置允许跨域请求