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

我想了解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”

相同的设置在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" /> 

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

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

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

希望这可以免除一些挫折。 似乎服务器的默认设置是接受任何未列出的HTTP动词 – 请参阅Request filtering -> HTTP Verbs -> Edit feature Settings 。 可以考虑明确添加要被允许的VERBS。 允许的动词可以指定附加这个片段,也可以作为<system.webServer>一个子<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 

最后一项措施是通过编辑在C:\Windows\System32\inetsrv\configfind的applicationhost.config 。 在这里,我添加了我需要的动词:

 <add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" /> 

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

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

从链接(为了便于阅读,没有用块引用):

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

<add name="ExtensionlessUrl-Integrated-4.0"

verb属性中添加PUTDELETE使得verb属性看起来像: verb="GET,HEAD,POST,DEBUG,PUT,DELETE"

对我来说,这是在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/> 

我使用了以下configuration:

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

希望它有帮助。 😉

我的场景是IIS 7.5上的Web站点中的Web应用程序。 该网站必须继续启用WebDAV,但是Web应用程序需要将其closures以在其REST API中支持PUT和DELETE。

为了得到这个工作,Web应用程序的Web.config需要这个:

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

从这里的其他答案的重要区别是需要runManagedModulesForWebDavRequests =“true”

URLScan工具用户

如果其他答案仍然无法正常工作,并且出现404错误 :如果安装了这些动词,可能会被URLScan工具明确拒绝。

您可以configurationURLScan.ini文件的[AllowVerbs][DenyVerbs]部分以满足您的需要。

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

什么对我来说是完全卸载WebDav。

进入处理器映射和设置WebDAV来处理所有动词是唯一的工作,尽pipe事实上, 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> 

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

您也可以使用IISpipe理用户界面并定义全局或默认的Web服务器

我尝试在IIS 8。

  • **卸载WebDav发布

    步骤卸载 – >控制面板 – >转到程序和function – >打开或closuresWindows特性 – >selectInternet信息服务 – >万维网服务 – >常见的HTTP特性 – >“删除”WebDAV发布通过取消选中WebDAV选项**

我正在使用Windows Server 2012 。 我尝试了所有,但只有这个工程。 感谢@John P

C:\ Windows \ System32 \ inetsrv \ config中findapplicationhost.config

像这样添加PUT,DELETE

 <add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,POST,PUT,DELETE" 

500错误的原因!

大家好,

我也想发布自己的研究成果,希望对未来的发烧友有帮助。 正如答案中所build议的那样,我无法卸载WebDav,因此我在webconfiguration文件中添加了以下行(来自其他答案)

  <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错误,当我启用debugging模式发现这一点

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

回答

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

方法1

1)转到您的IISpipe理器并select您的应用程序

2)转到处理程序映射function

3)findExtensionlessUrlHandler-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)从您的webconfiguration中删除ExtensionlessUrl处理程序

2)点击你的应用程序在IIS服务器,去HandlerMappings

3)查找ExtensionlessUrlHandler-Integrated-4.0(只有这个名字,忽略别人)

4)右键点击它并select编辑

编辑处理器

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

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

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

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