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\config
find的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
属性中添加PUT
和DELETE
使得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事实上, 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>
在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>