IIS 7.5 +为RESTFul服务启用PUT和DELETE,无扩展

Eat*_*oku 55 iis put openrasta

我试图了解IIS 7.5如何处理POST和PUT请求.

我正在使用OpenRasta框架编写RESTful服务.POST操作没有任何问题,但相同URL的PUT操作不会.它返回如下错误

Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
Run Code Online (Sandbox Code Playgroud)

网址如下"http://localhost/MyService/Resource.Something.manifest"

相同的设置在Visual Studio开发IIS中工作正常.

基本上默认的ExtensionlessUrlHandler不接受PUT和DELETE动词.只需要添加它们.

<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
Run Code Online (Sandbox Code Playgroud)

Joh*_*n P 74

要使IIS 7.5接受PUT和DELETE以获得PHP 5.4快速CGI驱动的REST API,我必须禁用WebDAV模块.否则,WebDAV模块使用PUT或DELETE干预HTTP请求.然而,要使这项工作有点令人困惑,我可能错过了一些步骤或以其他顺序完成它.

这些行作为应用程序根目录<system.webServer>web.config中-element的子项放置.

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>
Run Code Online (Sandbox Code Playgroud)

希望这可能会让人感到沮丧.看起来服务器的默认设置是接受未列出的任何HTTP动词 - 请参阅下面的设置Request filtering -> HTTP Verbs -> Edit feature Settings.可以考虑明确添加要允许的VERBS.可以指定允许的动词附加此片段,也作为子片段<system.webServer>.

    <security>
        <requestFiltering>
            <verbs allowUnlisted="false">
                <add verb="GET" allowed="true" />
                <add verb="POST" allowed="true" />
                <add verb="DELETE" allowed="true" />
                <add verb="PUT" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
Run Code Online (Sandbox Code Playgroud)

在客户端计算机上,可以从此处卸载WebDAV模块:

Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing
Run Code Online (Sandbox Code Playgroud)

让它运作的最后一项措施是通过编辑applicationhost.config找到C:\Windows\System32\inetsrv\config.在<system.webServer> -> <handlers>你内部将看到一个php条目,它只是verb="GET,HEAD,POST- 修改它以添加你需要的动词,例如:

<add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
                                                                 |
                                                                 |
                                                                 |
append verbs here  ----------------------------------------------|
Run Code Online (Sandbox Code Playgroud)

  • 许多论坛和帖子都建议删除`WebDAV`处理程序,但这还不足以解决我的问题.删除`WebDAVModule`就可以了.非常感谢! (2认同)

小智 29

1.转到IIS管理器.
2.点击你的应用程序.
3.转到"处理程序映射".
4.在功能列表中,双击"WebDAV".
5.单击"请求限制".
6.在"动词"选项卡中选择"所有动词".
7.按OK.

  • 在我的例子中,将WebDAV设置为All Verbs会导致全国范围内正在访问的遗留应用程序崩溃.这对我来说根本不起作用.我们必须完全删除WebDAV作为处理程序映射,以便让应用程序再次运行. (5认同)

Ser*_*Seb 11

请参阅从OR维基链接的http://learn.iis.net/page.aspx/901/iis-express-faq/.

从链接(为了便于阅读而不是块引用):

答:您可以修改IIS快速applicationHost.config的在%userprofile%\documents\IISExpress\config文件夹中.例如,为无扩展名Urls启用PUT和DELETE,向下滚动到IIS Express applicationHost.config文件的底部,并查找以以下内容开头的处理程序条目:

<add name="ExtensionlessUrl-Integrated-4.0" ...

verb添加属性PUTDELETE因此verb属性的样子:verb="GET,HEAD,POST,DEBUG,PUT,DELETE".


小智 9

我的方案是IIS 7.5上的网站中的Web应用程序.该网站必须继续启用WebDAV,但Web应用程序需要将其关闭才能在其REST API中支持PUT和DELETE.

为了实现这一点,Web应用程序的Web.config需要这样:

<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
  <remove name="WebDAVModule" />
</modules>

<handlers>
  <remove name="WebDAV" />
</handlers>
Run Code Online (Sandbox Code Playgroud)

与其他答案的重要区别在于需要runManagedModulesForWebDavRequests ="true"


小智 7

对我来说,这可以解决web.config中的问题.

<system.webserver>
    <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
<system.webserver/>

<system.web>
  <authentication mode="Windows" />
  <identity impersonate="true"/>
<system.web/>
Run Code Online (Sandbox Code Playgroud)

我使用了以下配置:

  • IIS 7.5
  • Windows Server 2008 R2
  • 自定义应用程序池,.NET 4.0,集成
  • Windows身份验证= true
  • 匿名身份验证= false

希望能帮助到你.;-)


Alp*_*Dev 6

URLScan工具用户

如果其他答案仍然无效并且您收到404错误:如果您安装了这些动词,则可能会被URLScan工具明确拒绝.

您可以配置[AllowVerbs][DenyVerbs]对的部分URLScan.ini文件,以满足您的需求.

注意启用这些动词的安全风险.


leo*_*ojh 5

对我有用的是完全卸载WebDav.


Ric*_*tte 5

进入处理程序映射并设置 WebDAV 来处理所有动词是唯一对我有用的事情,尽管事实上PUTDELETE已经被列为已处理动词。我的工作 web.config 是:

  <system.webServer>
    <handlers>     
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <remove name="WebDAV" />
      <add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
    </handlers>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)