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>