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

我感谢任何帮助,因为这个网站应该今晚生活!

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

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

我已经环顾networking寻找解决scheme,并实施了最合理的解决scheme。 我的networkingconfiguration有以下设置:

<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创作规则似乎被禁用。

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

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

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

我希望这有帮助

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

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

模块:IIS Web Core通知:ExecuteRequestHandler“

这里build议解决scheme。 还需要从处理程序中删除它。

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

在我的情况下,上述解决scheme都没有工作。 这是因为我在我的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 } ); 

我从这里得到了这个解决scheme。

用于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方法一样。

我也有同样的问题,我打电话给WebAPi,并得到这个错误。 在web.config中添加以下configuration的服务解决了我的问题

  <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; } } 

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

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

只需添加。 如果这是你的configuration

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

请继续做雨果说的,不要把Route属性设置为控制器get方法,这就给我一个问题了。

转到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控制器上的删除方法公开。

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

“不允许”而不是“未find”的原因是我也有相同路由的Get方法(这是实现REST时的正常情况)。 public Get函数被路由匹配,然后由于错误的http方法而被拒绝。

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

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

不过,我使用的是int而不是id的默认string 。 添加{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>