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

IIS 7.5+;为RESTFul服务启用PUT和DELETE,无扩展,iis,put,openrasta,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 url如下所示“http://localhost/

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

我正在使用OpenRasta框架编写一个RESTful服务。POST操作可以正常工作,但对同一URL的PUT操作没有任何问题。它返回如下所示的错误

Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
url如下所示“http://localhost/MyService/Resource.Something.manifest"

同样的设置在VisualStudioDevelopmentIIS中也可以正常工作

解决方案

基本上,默认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" />

查看从或wiki链接的

从链接(为了可读性,不引用块):

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

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

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

这些行作为应用程序根目录中web.config中
-元素的子元素放置

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
    <remove name="WebDAV" />
</handlers>
在客户端计算机上,可以从以下位置卸载WebDAV模块:

Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing
使其工作的最后一项措施是编辑
C:\Windows\System32\inetsrv\config
中的
applicationhost.config
。在
->
中,您将看到一个php条目,该条目仅包含
动词=“GET,HEAD,POST
-对其进行修改以添加所需的动词,例如:

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

|
|
|
在这里附加动词----------------------------------------------|

对我来说,这就是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
希望它能帮助。;-

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

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


当心启用这些动词的可能性。

对我来说,有效的方法是完全卸载WebDav。

我在IIS 8中尝试过

  • **卸载WebDav发布

    卸载步骤 ->控制面板->转到程序和功能->打开窗口 功能打开或关闭->选择Internet信息服务->全球 Web服务->通用HTTP功能->通过取消选中WebDAV选项“删除”WebDAV发布**


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

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

7.在windows server 2012中按OK。

。 使用管理员权限在记事本中打开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>

请注意,删除和放置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请求

我的场景是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”

500个错误的原因!

大家好

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

回答

因为在handler mappings部分中已经有一个ExtensionlessUrlHandler,所以请执行以下操作来解决此问题

方法1

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

2) 转到处理程序映射功能

3) 查找ExtensionlessUrlHandler-Integrated-4.0并将其删除

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


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

这将使无扩展处理程序能够
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
  <remove name="WebDAVModule" />
</modules>

<handlers>
  <remove name="WebDAV" />
</handlers>
 <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>
 Cannot add duplicate collection entry of type 'add' with unique key attribute 'name' set to 'ExtensionlessUrlHandler-Integrated-4.0'
<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>
<?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>