【问题标题】:WebAPI Delete not working - 405 Method Not AllowedWebAPI 删除不起作用 - 405 方法不允许
【发布时间】:2013-03-15 04:28:10
【问题描述】:

感谢您对此提供的任何帮助,因为该网站应该在今晚上线!

我有一个带有 Delete 方法的 web api 控制器。该方法在我运行 IIS Express (Windows 8) 的本地机器上执行良好,但一旦我将它部署到实时 IIS 服务器 (Windows Server 2008 R2),它就停止工作并抛出以下错误消息:

HTTP 错误 405.0 - 方法不允许 您正在查找的页面无法显示,因为正在使用无效的方法(HTTP 动词)

我在网上寻找解决方案,并实施了最合理的解决方案。我的网络配置有以下设置:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<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" />
</handlers>
</system.webServer>

我还尝试更改 IIS 中的处理程序映射和请求过滤,但无济于事。请注意,IIS 中的 WebDAV 创作规则似乎已被禁用。

任何想法将不胜感激 谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 http-status-code-405


    【解决方案1】:

    如果您使用的是 IIS 7.0 或更高版本。 此问题主要与 IIS 服务器上的 WebDAV 扩展模块有关。 这发生在使用发布或删除操作时。

    请在网络配置中尝试以下设置

    <system.webServer>
       <modules>
           <remove name="WebDAVModule" />
       </modules>
       <handlers>
         <remove name="WebDAV" />
       </handlers>
    </system.webServer>
    

    【讨论】:

      【解决方案2】:

      在我的情况下,我错过了将 {id} 添加到 [Route("")] 并且我得到了同样的错误。 添加它为我解决了问题:[Route("{id}")]

      【讨论】:

        【解决方案3】:

        在这里尝试了几乎所有解决方案后,这对我有用。 将此添加到您的 API 配置文件中

        <system.webServer>
            <handlers>
              <remove name="WebDAV" />
              <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
              <remove name="OPTIONSVerbHandler" />
              <remove name="TRACEVerbHandler" />
              <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
            </handlers>
            <modules>
                <remove name="WebDAVModule" />
            </modules>
        </system.webServer>
        

        【讨论】:

          【解决方案4】:

          就我而言,上述解决方案均无效。这是因为我在Delete 方法中更改了参数的名称

          我有

          public void Delete(string Questionid)
          

          而不是

          public void Delete(string id)
          

          我需要使用id 名称,因为这是在我的WebApiConfig 文件中声明的名称。注意第三行和第四行中的id 名称:

                      config.Routes.MapHttpRoute(
                      name: "DefaultApi",
                      routeTemplate: "api/{controller}/{id}",
                      defaults: new { id = RouteParameter.Optional }
                  );
          

          我从here得到了这个解决方案。

          【讨论】:

            【解决方案5】:

            我们必须在 web.config 中添加自定义标头,因为我们的请求有多个标头会混淆 API 响应。

            <httpProtocol>
                <customHeaders>
                    <remove name="Access-Control-Allow-Methods" />
                    <remove name="Access-Control-Allow-Origin" />
                    <remove name="Access-Control-Allow-Headers" />
                </customHeaders>
            </httpProtocol>
            

            【讨论】:

              【解决方案6】:

              我遇到了类似的问题,但对于 PUT - 没有其他建议对我有用。

              但是我使用int 而不是默认的string 作为id。在路由中添加{id:int} 解决了我的问题。

                  [Route("api/Project/{id:int}")]
                  public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
                  {
                     ...
                  }
              

              【讨论】:

                【解决方案7】:

                HTTP DELETE 动词的 Javascript 必须是这样的:

                $.ajax({
                    **url: "/api/SomeController/" + id,**
                    type: "DELETE",
                    dataType: "json",
                    success: function(data, statusText) {
                        alert(data);
                    },
                    error: function(request, textStatus, error) {
                        alert(error);
                        debugger;
                    }
                });
                

                不要不要使用这样的东西:

                ...
                data: {id:id}
                ...
                

                当你使用 POST 方法时。

                【讨论】:

                • 嗨@Pavel,如果您确实使用的是完全RESTful 实现,这是正确的。不幸的是,并不是每个人都这样做,并且看到开发人员使用 POST 而不是 DELETE 等是很常见的。感谢您澄清这一点。
                【解决方案8】:

                只是添加。如果这是你的配置

                config.Routes.MapHttpRoute(
                            名称:“默认API”,
                            routeTemplate: "api/{controller}/{id}",
                            默认值:新 { id = RouteParameter.Optional }

                请继续按照 Hugo 说的做,不要将 Route 属性设置为控制器的 get 方法,这对我来说是个问题。

                【讨论】:

                  【解决方案9】:

                  我有 405 错误 Method Not Allowed 因为我忽略了将 WebApi 控制器上的 Delete 方法公开。

                  我花了很长时间才找到这个(太长了!),因为在这种情况下我会预料到 Not Found 错误,所以我错误地假设我的 Delete 方法被拒绝了。

                  Not Allowed 而不是 Not Found 的原因是我也有一个 Get 方法用于相同的路由(这将是实现 REST 时的正常情况)。公有Get函数被路由匹配,然后因为http方法错误而被拒绝。

                  我知道一个简单的错误,但它可能会为其他人节省一些时间。

                  【讨论】:

                    【解决方案10】:

                    转到 applicationHost.config(通常在 C:\Windows\System32\inetsrv\config 下)文件并注释掉 applicationHost.config 中的以下行

                    1)在下:

                    <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
                    

                    2) 还注释掉

                    下的上述处理程序引用的以下模块
                    <add name="WebDAVModule" />
                    

                    【讨论】:

                    • 如果您不想(或不能)修改机器范围的配置文件,或者使用其他答案 stackoverflow.com/a/47907578/1754743 在您自己的 web.config 中删除这些处理程序
                    【解决方案11】:

                    我也遇到了同样的问题,我正在调用 WebAPi 并收到此错误。 在 web.config 中为服务添加以下配置解决了我的问题

                        <modules runAllManagedModulesForAllRequests="true">
                            <remove name="WebDAVModule"/> <!-- add this -->
                        </modules>
                    

                    在 web.config 文件中解决了我的问题。 这就是我从客户端调用的方式

                    using (var client = new HttpClient())
                    {
                        client.BaseAddress = new Uri(environment.ServiceUrl);
                        client.DefaultRequestHeaders.Accept.Clear();
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
                        if (response.IsSuccessStatusCode)
                        {
                            string strResult = response.Content.ReadAsAsync<string>().Result;
                        }
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      Delete 方法顶部的[HttpPost] 属性为我解决了这个问题:

                      [HttpPost]
                      public void Delete(int Id)
                      {
                        //Delete logic
                      }
                      

                      【讨论】:

                      • 这可能是它为您工作的原因。我使用的是早期版本,大约在 2013 年初,所以从那以后已经修复了很多问题。不过很高兴知道它对您有用。
                      • 老实说,这不是一个好的答案。使用此方法解决问题的人正在使用 POST 而不是 DELETE,因此它不能也不应该工作
                      • 我相信这是因为您在客户端使用data(即请求的正文)而不是params(即请求的url)。
                      • 我同意 Alexander Derck 的观点,这是一个拼凑而非解决方案。
                      【解决方案13】:

                      在某些情况下,仅从模块中删除它会产生下一个错误:

                      500.21 处理程序“WebDAV”的模块列表中有一个错误模块“WebDAVModule”

                      模块:IIS Web 核心通知:ExecuteRequestHandler"

                      建议解决方案here。还需要从处理程序中删除它。

                      <system.webServer>
                          <modules>
                              <remove name="WebDAVModule" />
                          </modules>
                          <handlers>
                              <remove name="WebDAV" />
                          </handlers>
                      </system.webServer>
                      

                      【讨论】:

                        【解决方案14】:

                        我终于找到了解决办法! 如果您遇到同样的问题,请将以下内容添加到您的 web.config

                        <system.webServer>
                            <validation validateIntegratedModeConfiguration="false"/>
                            <modules runAllManagedModulesForAllRequests="true">
                                <remove name="WebDAVModule"/> <!-- ADD THIS -->
                            </modules>
                            ... rest of settings here
                        

                        希望对你有帮助

                        【讨论】:

                        • 我还必须按照stackoverflow.com/a/6698096/254156在处理程序部分添加一个删除
                        • 也在这里工作。但是有人可以解释一下与 WebDAVModule 的关系吗?
                        • 对于那些只是复制粘贴的人:runAllManagedModulesForAllRequests="true" 并不是真正需要的,实际上可以破坏其他东西。
                        • 其他一些网络帖子会建议使用 IIS Modules 部分删除模块,这会禁用它但它仍然会导致这个/类似的问题,这是最可靠的方法
                        • @ZarShardan(和其他人)仅供参考:如果您删除 runAllManagedModulesForAllRequests="true" 属性,您还需要在 节点下添加
                        猜你喜欢
                        • 2014-06-21
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-05-21
                        • 2016-05-06
                        • 2016-12-03
                        • 2021-12-09
                        • 1970-01-01
                        • 2014-12-29
                        相关资源
                        最近更新 更多