我试图了解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" />
答案 0 :(得分:74)
要使IIS 7.5接受PUT和DELETE以获得PHP 5.4快速CGI驱动的REST API,我必须禁用WebDAV模块。否则,WebDAV模块使用PUT或DELETE干预HTTP请求。然而,为了使这项工作有点令人困惑,我可能错过了一些步骤或者以另一种顺序完成它。
这些行被放置为应用程序根目录中 web.config 中<system.webServer>
- 元素的子元素。
<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 ----------------------------------------------|
答案 1 :(得分:29)
1.转到IIS管理器。
2.点击你的应用程序。
3.转到“处理程序映射”。
4.在功能列表中,双击“WebDAV”
5.单击“请求限制”。
6.在“动词”选项卡中选择“所有动词”
7.按“确定”。
答案 2 :(得分: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
属性中添加PUT
和DELETE
,以便verb
属性如下:verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
。
答案 3 :(得分: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 =&#34; true&#34;
答案 4 :(得分: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
希望它有所帮助。 ; - )
答案 5 :(得分:6)
如果其他答案仍然不起作用且您收到 404错误:如果您安装了 URLScan 工具,这些动词可能会被明确拒绝。
您可以配置[AllowVerbs]
文件的[DenyVerbs]
和URLScan.ini
部分,以满足您的需求。
小心启用这些动词的security risks。
答案 6 :(得分:5)
对我有用的是完全卸载WebDav。
答案 7 :(得分:4)
进入处理程序映射并设置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>
答案 8 :(得分:3)
<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服务器
答案 9 :(得分:3)
我在IIS 8中尝试过。
**卸载WebDav Publishing
卸载步骤 - &GT;控制面板 - &gt;转到程序和功能 - &gt;转动窗户 开启或关闭的特征 - &gt;选择Internet信息服务 - &gt;全球范围 Web服务 - &gt;常见HTTP特性 - &gt;&#34;删除&#34;通过取消选中WebDAV选项**
答案 10 :(得分: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)从您的网络配置中删除ExtensionlessUrl处理程序
2)在IIS服务器中单击您的应用程序,转到HandlerMappings
3)查找ExtensionlessUrlHandler-Integrated-4.0(仅此名称,忽略其他名称)
4)右键单击它并选择编辑
5)点击“请求限制”并选择“动词”选项卡&amp;选择所有动词
这将使无扩展处理程序允许所有动词。
我将使用方法1,因为我们可以在web.config中控制。但请确保你 检查部署服务器是否有重复的处理程序定义。
答案 11 :(得分:1)
在 Windows Server 2012 中。 在具有管理员权限的记事本中打开 applicationHost.config 文件
在 C:\ Windows \ System32 \ inetsrv \ config 中找到applicationHost.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请求
答案 12 :(得分:1)
我的web.config with asp.net core 1.0
GridPane