我试图了解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 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 ----------------------------------------------|
我在IIS 8中尝试过。
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)右键单击它并选择“编辑”
5)单击“请求限制”并选择“动词”选项卡并选择“所有动词”
这将使无扩展处理程序允许所有动词。
我将使用方法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>
在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请求
1.转到IIS管理器。 2.点击你的应用程序。 3.转到“处理程序映射”。 4.在功能列表中,双击“WebDAV”。 5.单击“请求限制”。 6.在“动词”选项卡中选择“所有动词”。 7.按OK。
请参阅从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
属性中添加PUT
和DELETE
所以verb
属性看起来像:verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
。
我的方案是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”
对我来说,这可以解决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
希望能帮助到你。 ;-)
如果其他答案仍然无效并且您收到404错误:如果您安装了这些动词,则可能会被URLScan工具明确拒绝。
您可以配置[AllowVerbs]
文件的[DenyVerbs]
和URLScan.ini
部分以满足您的需求。
小心启用这些动词的security risks。
对我有用的是完全卸载WebDav。
尽管PUT
和DELETE
已被列为处理动词,但进入处理程序映射并设置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>
在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服务器