WebAPI 删除不工作-405方法不允许

我感谢任何帮助,因为该网站应该在今晚上线!

我有一个 web api 控制器与删除方法。这个方法在运行 IIS Express (Windows 8)的本地机器上执行得很好,但是一旦我将它部署到活动的 IIS 服务器(Windows Server 2008 R2) ,它就停止工作,并抛出以下错误消息:

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

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

<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 中的 Handler 映射和请求过滤,但没有效果。请注意,IIS 中的 WebDAV 创作规则似乎被禁用了。

任何想法都会很受欢迎 谢谢。

89144 次浏览

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

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

希望这个能帮上忙

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

处理程序“ WebDAV”在它的模块列表中有一个坏模块“ WebDAVModule”

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

solution was suggested 给你. Also need to remove it from handlers.

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

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

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

在我的例子中,上面的解决方案都不起作用,这是因为我在 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 }
);

我从 给你公司得到了这个解决方案。

用于 HTTPDELETE谓词的 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方法时。

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

转到 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)还要注释掉上面的处理程序在 < module > 下引用的下面的模块

<add name="WebDAVModule" />

我有405错误方法不允许,因为我忽略了使删除方法对 WebApi 控制器公开。

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

“不允许”而不是“不发现”的原因是,我还有一个用于相同路由的 Get 方法(在实现 REST 时通常是这种情况)。Public Get 函数与路由匹配,然后由于错误的 http 方法而被拒绝。

一个简单的错误,我知道,但它可以节省别人一些时间。

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

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

请继续按照 Hugo 所说的做,不要将 Route 属性设置为控制器的 get 方法,这在我的例子中给出了一个问题。

我有类似的问题,但为 PUT-没有其他建议为我工作。

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

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

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

在尝试了这里几乎所有的解决方案之后,这对我来说都很有效。 将其添加到 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>

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

如果您使用的是 IIS 7.0或更高版本。 本课题主要涉及 IIS 服务器上的 WebDAV 扩展模块。 这是在使用 Post 或 delete 操作时发生的。

请在网页设定中尝试以下设定

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

我正在从事 .Net 5 Api项目,并补充说:

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

web.config<system.webServer>部分

  <handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
        

<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>

帮我修好了。

然而,棘手的部分是使这在 Azure DevOps CI-CD管道工作。
我设法做到了这一点,并讲述了我是如何在这里做到的: Azure DevOps 发布流水线 Web.Config 编辑