【问题标题】:IIS 7.5 + enable PUT and DELETE for RESTFul service, extensionlessIIS 7.5 + 为 RESTFul 服务启用 PUT 和 DELETE,无扩展
【发布时间】:2011-10-08 00:32:20
【问题描述】:

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

【问题讨论】:

    标签: iis put openrasta


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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 请求

        【讨论】:

        • 我的问题是一样的。我尝试了所有解决方案,你也尝试了,但对我没有用。
        【解决方案4】:

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

        这些行作为&lt;system.webServer&gt;-元素的子元素放置在应用程序根目录的web.config中。

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

        希望这可以避免一些挫折。服务器的默认设置似乎是接受任何未列出的 HTTP 动词 - 请参阅Request filtering -&gt; HTTP Verbs -&gt; Edit feature Settings 下的设置。可以考虑明确添加要允许的动词。可以指定允许的动词附加这个 sn-p,也可以作为 &lt;system.webServer&gt; 的子项。

            <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 中的applicationhost.config。在&lt;system.webServer&gt; -&gt; &lt;handlers&gt; 中,您将看到一个只有verb="GET,HEAD,POST 的php 条目 - 修改它以添加您需要的动词,例如:

        <add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
                                                                         |
                                                                         |
                                                                         |
        append verbs here  ----------------------------------------------|
        

        【讨论】:

        • 嗨乔恩,这解决了我的问题,我只是专门允许动词并删除了 webdav 模块....
        • 许多论坛和帖子都建议删除WebDAV 处理程序,但这不足以解决我的问题。删除 WebDAVModule 就可以了。非常感谢!
        • 该死的 WebDAV! :D 感谢您的提示
        • 过去 10 天我一直在寻找这个答案 :)
        • 我只是在 webconfig 中添加这个
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          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 Server 中点击你的应用,进入 HandlerMappings

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

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

          edit handler

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

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

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

          【讨论】:

            【解决方案7】:

            我的场景是 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"

            【讨论】:

            • 实际上,我认为区别(以及对我有用的关键部分)是 部分
            【解决方案8】:

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

            【讨论】:

            • 在我的例子中,将 WebDAV 设置为 All Verbs 会导致在全国范围内访问的遗留应用程序失效。这对我根本不起作用。我们必须完全删除 WebDAV 作为处理程序映射,以使应用程序再次运行。
            • 这个解决方案的副作用是Visual Studio的调试不再起作用,而是抛出了405错误。
            • Idk .. 我的问题是 PUT 请求被阻止,并且 PUT 已经在允许列表中
            【解决方案9】:

            尽管PUTDELETE 已经被列为已处理的动词,但进入处理程序映射并将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>
            

            【讨论】:

              【解决方案10】:

              我在 IIS 8 中尝试过。

              • **卸载 WebDav Publishing

                卸载步骤 -> 控制面板 -> 转到程序和功能 -> 打开窗口 打开或关闭功能-> 选择 Internet 信息服务-> 全球 Web Services->Common HTTP Featues->"Remove" WebDAV Publishing by unchecking WebDAV option**

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  URLScan 工具用户

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

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

                  当心security risks 启用这些动词。

                  【讨论】:

                    【解决方案13】:

                    对我来说,这可以在 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
                    • 匿名身份验证 = 假

                    希望对您有所帮助。 ;-)

                    【讨论】:

                      【解决方案14】:

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

                      【讨论】:

                        【解决方案15】:

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

                        来自链接(为了便于阅读,未引用块引用):

                        A:您可以修改%userprofile%\documents\IISExpress\config文件夹中的IIS Express applicationHost.config。例如,要为无扩展 URL 启用 PUT 和 DELETE,向下滚动到 IIS Express applicationHost.config 文件的底部并查找以:

                        开头的处理程序条目

                        &lt;add name="ExtensionlessUrl-Integrated-4.0"……

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

                        【讨论】:

                          猜你喜欢
                          • 2013-12-06
                          • 2012-12-17
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多