59

我试图了解 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" />
4

15 回答 15

80

为了让 IIS 7.5 接受 PHP 5.4 快速 CGI 驱动的 REST API 的 PUT 和 DELETE,我必须禁用 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. 可以考虑明确添加要允许的动词。可以指定允许的动词附加此片段,也可以作为<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.configC:\Windows\System32\inetsrv\config. 您将在其中<system.webServer> -> <handlers>看到一个 php 条目,该条目刚刚verb="GET,HEAD,POST- 修改它以添加您需要的动词,例如:

<add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
                                                                 |
                                                                 |
                                                                 |
append verbs here  ----------------------------------------------|
于 2013-04-29T09:53:12.613 回答
33

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

于 2015-02-05T13:16:10.807 回答
11

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

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

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

<add name="ExtensionlessUrl-Integrated-4.0"

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

于 2011-08-15T11:09:38.713 回答
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="true"

于 2016-06-17T03:10:04.740 回答
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
  • 视窗服务器 2008 R2
  • 自定义应用程序池,.NET 4.0,集成
  • Windows 身份验证 = 真
  • 匿名身份验证 = 假

希望能帮助到你。;-)

于 2013-08-13T14:26:45.757 回答
6

URLScan 工具用户

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

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

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

于 2014-01-05T16:08:58.930 回答
5

对我有用的是完全卸载 WebDav。

于 2014-04-11T17:19:30.123 回答
4

进入处理程序映射并设置 WebDAV 来处理所有动词是唯一对我有用的事情,尽管事实上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>
于 2014-07-16T21:27:37.093 回答
3

在 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 服务器上进行定义

于 2012-07-20T17:21:41.020 回答
3

我在 IIS 8 中尝试过。

  • **卸载 WebDav Publishing

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

于 2014-07-09T06:08:56.107 回答
2

500错误的原因!

大家好,

我也想发表我自己的研究,希望对未来的爱好者有所帮助。正如答案中所建议的,我无法卸载 WebDav,所以我在 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>

但是我得到一个 500 错误,当我启用调试模式时发现这个

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

回答

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

方法一

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

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

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>

方法二

1) 从您的网络配置中删除 ExtensionlessUrl 处理程序

2) 在 IIS 服务器中单击您的应用程序,转到 HandlerMappings

3)找到ExtensionlessUrlHandler-Integrated-4.0(只有这个名字,忽略其他)

4)右键单击它并选择编辑

编辑处理程序

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

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

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

于 2017-09-16T19:53:24.597 回答
1

我的 web.config 与 asp.net core 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>
于 2017-10-21T19:50:06.390 回答
1

Windows 服务器 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 请求

于 2016-02-14T15:44:06.970 回答
0

主要解决方案是从特定网站模块的部分中删除 webdavmodule。

因此,您可以从 IIS 和 webconfig 中执行此操作。

于 2021-12-07T18:12:50.213 回答
0

我正在处理同样的问题。我的解决方案是在 Plesk Panel 中关闭 Web 应用程序的防火墙模式。

在此处输入图像描述

于 2021-12-29T16:01:40.013 回答