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

问题描述 投票:55回答:13

我试图了解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" />
iis put openrasta
13个回答
74
投票

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

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

<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  ----------------------------------------------|

3
投票

我在IIS 8中尝试过。

  • **卸载WebDav Publishing 卸载步骤 - >控制面板 - >转到程序和功能 - >打开或关闭Windows特征 - >选择Internet信息服务 - >万维网服务 - >常见HTTP特征 - >通过取消选中WebDAV选项“删除”WebDAV发布**

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)从您的Web配置中删除ExtensionlessUrl处理程序

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

3)找到ExtensionlessUrlHandler-Integrated-4.0(只有这个名字,忽略其他名字)

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

edit handler

5)单击“请求限制”并选择“动词”选项卡并选择“所有动词”

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

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


1
投票

我的web.config与asp.net核心1.0

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

1
投票

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

applicationHost.config文件位于C:\ Windows \ System32 \ inetsrv \ 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请求


29
投票

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


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"


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 =“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/>

我使用了以下配置:

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

希望能帮助到你。 ;-)


6
投票

URLScan工具用户

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

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

小心启用这些动词的security risks


5
投票

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


4
投票

尽管PUTDELETE已被列为处理动词,但进入处理程序映射并设置WebDAV以处理所有动词是唯一对我有用的事情。我的工作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>

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服务器

© www.soinside.com 2019 - 2024. All rights reserved.