ChatGPT解决这个技术问题 Extra ChatGPT

WebAPI 删除不起作用 - 405 方法不允许

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

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

HTTP 错误 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效的方法(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 创作规则似乎已被禁用。

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


L
Leniel Maccaferri

我最终找到了解决方案!如果您遇到同样的问题,请将以下内容添加到您的 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 模块部分删除模块,这会禁用它,但它仍然会导致这个/类似的问题,这是最可靠的方法
@ZarShardan(和其他人)仅供参考:如果您删除 runAllManagedModulesForAllRequests="true" 属性,您还需要在 节点下添加
C
Community

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

500.21 处理程序“WebDAV”在其模块列表中有一个错误模块“WebDAVModule”模块:IIS Web 核心通知:ExecuteRequestHandler”

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

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

H
Hugo Nava Kopp

就我而言,上述解决方案均无效。这是因为我在 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 得到了这个解决方案。


在我的例子中,我用与实际方法不同的参数名称定义了 [Route(...)]。
M
Michael Gaskill

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 等是很常见的。感谢您澄清这一点。
A
Abhishek B.

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

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

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

B
Beingnin

在这里尝试了几乎所有解决方案后,这对我有用。将此添加到您的 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>

T
Tony Hinkle

我也遇到了同样的问题,我正在调用 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;
    }
}

a
arviman

转到 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 中删除这些处理程序
R
Reza

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


P
Paul D

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

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

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

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


u
user6247020

只是补充。如果这是你的配置

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

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


H
Hath

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

但是,我使用的是 int 而不是默认的 string 作为 id。将 {id:int} 添加到路线解决了我的问题。

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

Z
Zadok

我们必须在 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>

A
Andrey Gubal

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

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

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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅