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

时间:2011-07-18 20:38:19

标签: 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

网址如下“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" />

13 个答案:

答案 0 :(得分:74)

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

这些行被放置为应用程序根目录中 web.config <system.webServer> - 元素的子元素。

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>

希望这可能会让人感到沮丧。似乎服务器的默认设置是接受未列出的任何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>

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

Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing

让其发挥作用的最后一项措施是修改applicationhost.config中的C:\Windows\System32\inetsrv\config。在<system.webServer> -> <handlers>内你会看到一个只有verb="GET,HEAD,POST的php条目 - 修改它以添加你需要的动词,例如:

<add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
                                                                 |
                                                                 |
                                                                 |
append verbs here  ----------------------------------------------|

答案 1 :(得分:29)

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

答案 2 :(得分:11)

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

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

答:您可以修改applicationHost.config文件夹中的IIS Express %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"

答案 3 :(得分: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>

与其他答案的重要区别在于需要runManagedModulesForWebDavRequests =&#34; true&#34;

答案 4 :(得分: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/>

我使用了以下配置:

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

希望它有所帮助。 ; - )

答案 5 :(得分:6)

URLScan工具用户

如果其他答案仍然不起作用且您收到 404错误:如果您安装了 URLScan 工具,这些动词可能会被明确拒绝。

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

小心启用这些动词的security risks

答案 6 :(得分:5)

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

答案 7 :(得分:4)

进入处理程序映射并设置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>

答案 8 :(得分:3)

web.config中的

<system.webServer>
    <handlers>
        <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>

您还可以使用IIS管理UI并定义全局或默认Web服务器

答案 9 :(得分:3)

我在IIS 8中尝试过。

  • **卸载WebDav Publishing

    卸载步骤 - &GT;控制面板 - &gt;转到程序和功能 - &gt;转动窗户 开启或关闭的特征 - &gt;选择Internet信息服务 - &gt;全球范围 Web服务 - &gt;常见HTTP特性 - &gt;&#34;删除&#34;通过取消选中WebDAV选项**

  • 进行WebDAV发布

答案 10 :(得分:2)

500错误的原因!

大家好,

我也希望发表我自己的研究,希望它能帮助未来的爱好者。      正如答案所示,我无法卸载WebDav,所以我在web配置中添加了以下行(来自其他答案)

 <system.webServer>
    <handlers>
        <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>

但是我得到了500错误,当我启用调试模式时发现了这个

 Cannot add duplicate collection entry of type 'add' with unique key attribute 'name' set to 'ExtensionlessUrlHandler-Integrated-4.0'

<强>答案

因为处理程序映射部分中已经存在ExtensionlessUrlHandler,请执行以下操作来解决此问题。

方法1

1)转到您的IIS管理器并选择您的应用

2)转到Handler Mappings功能

3)找到ExtensionlessUrlHandler-Integrated-4.0并删除它。

4)在webconfig中添加ExtensionlessUrlHandler(如上面的答案中所述)

<system.webServer>
<handlers>
    <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>

方法2

1)从您的网络配置中删除ExtensionlessUrl处理程序

2)在IIS服务器中单击您的应用程序,转到HandlerMappings

3)查找ExtensionlessUrlHandler-Integrated-4.0(仅此名称,忽略其他名称)

4)右键单击它并选择编辑

edit handler

5)点击“请求限制”并选择“动词”选项卡&amp;选择所有动词

这将使无扩展处理程序允许所有动词。

我将使用方法1,因为我们可以在web.config中控制。但请确保你 检查部署服务器是否有重复的处理程序定义。

答案 11 :(得分:1)

Windows Server 2012 中。 在具有管理员权限的记事本中打开 applicationHost.config 文件

C:\ Windows \ System32 \ inetsrv \ config

中找到

applicationHost.config 文件

找到

部分
 <verbs allowUnlisted="false" applyToWebDAV="true">
   <add verb="GET" allowed="true" />
   <add verb="HEAD" allowed="true" />
   <add verb="POST" allowed="true" />
   <add verb="DELETE" allowed="false" />
   <add verb="TRACE" allowed="false" />
   <add verb="PUT" allowed="false" />
   <add verb="OPTIONS" allowed="false" />
</verbs>

注意DELETE和PUT HTTP动词设置为false。 将它们更改为true。

现在应该如下所示

 <verbs allowUnlisted="false" applyToWebDAV="true">
   <add verb="GET" allowed="true" />
   <add verb="HEAD" allowed="true" />
   <add verb="POST" allowed="true" />
   <add verb="DELETE" allowed="true" />
   <add verb="TRACE" allowed="false" />
   <add verb="PUT" allowed="true" />
   <add verb="OPTIONS" allowed="false" />
</verbs>

保存文件。您已在Web服务器上启用了HttpPut和HttpDelete请求

答案 12 :(得分:1)

我的web.config with asp.net core 1.0

GridPane