405方法不允许web api

这个错误是很常见的,我尝试了所有的解决scheme,而不是他们的工作。 我已经禁用WebDAV发布控制面板中,并将其添加到我的networkingconfiguration文件:

<handlers> <remove name="WebDAV"/> </handlers> <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule"/> </modules> 

错误仍然存​​在。 这是控制器:

  static readonly IProductRepository repository = new ProductRepository(); public Product Put(Product p) { return repository.Add(p); } 

方法实现:

  public Product Add(Product item) { if (item == null) { throw new ArgumentNullException("item"); } item.Id = _nextId++; products.Add(item); return item; } 

这就是抛出exception的地方:

 client.BaseAddress = new Uri("http://localhost:5106/"); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.PostAsJsonAsync("api/products", product);//405 exception 

有什么build议么?

您正在从客户端发布:

 await client.PostAsJsonAsync("api/products", product); 

不是PUTING。

您的Web API方法只接受PUT请求。

所以:

 await client.PutAsJsonAsync("api/products", product); 

我有同样的例外。 我的问题是我曾经使用过:

 using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; } 

应该

 using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; } 

我尝试了很多方法来获取DELETE方法(我得到405方法不允许web api),最后我添加了[Route(“api / scan / {id}”)]到我的控制器,工作正常。 希望这个职位帮助一些。

  // DELETE api/Scan/5 [Route("api/scan/{id}")] [ResponseType(typeof(Scan))] public IHttpActionResult DeleteScan(int id) { Scan scan = db.Scans.Find(id); if (scan == null) { return NotFound(); } db.Scans.Remove(scan); db.SaveChanges(); return Ok(scan); } 

我的问题原来是WebAPI中的属性路由。 我创build了一个自定义路由,它将其视为GET而不是WebAPI,发现它是一个POST

  [Route("")] [HttpPost] //I added this attribute explicitly, and it worked public void Post(ProductModel data) { ... } 

我知道它必须是愚蠢的东西(消耗你整整一天)

我得到了我的GET调用405,问题原来,我在GET服务器端方法Get(int formId)命名参数,我需要改变路线,或重命名它的Get(int id)

Chrome经常会在发帖之前尝试执行OPTIONS调用。 它这样做是为了确保CORS头是有序的。 如果您没有在您的API控制器中处理OPTIONS调用,可能会有问题。

 public void Options() { } 

如果说你的方法正在等待一个参数并且你没有通过它,你也可以得到405错误。

这是行不通的(405错误)

HTML视图/ Javascript

 $.ajax({ url: '/api/News', //..... 

Web Api:

 public HttpResponseMessage GetNews(int id) 

因此,如果方法签名像上面那么你必须这样做:

HTML视图/ Javascript

 $.ajax({ url: '/api/News/5', //..... 

如果你有类似的路线

 [Route("nuclearreactors/{reactorId}")] 

您需要在方法中使用完全相同的参数名称

 public ReactorModel GetReactor(reactorId) { ... } 

如果你没有传递完全相同的参数,你可能会得到错误“405方法不允许”,因为路由不匹配请求,WebApi将使用不同的允许的HTTP方法命中不同的控制器方法。

这不能回答你的具体问题,但是当我遇到同样的问题时,我最终在这里结束了,我发现更多的人可能也会这样做。

我遇到的问题是我不经意地将我的Get方法声明为静态的 。 我错过了整个上午,并没有引起任何属性或类似的警告。

不正确:

 public class EchoController : ApiController { public static string Get() { return string.Empty; } } 

正确:

 public class EchoController : ApiController { public string Get() { return string.Empty; } } 

我迟到了这个派对,但是因为上面没有什么是可行的,或者在大多数情况下都是可行的,所以这是我最终解决的问题。

在服务器上的网站/服务托pipe,function是必需的! HTTP激活!

服务器pipe理器>pipe理>添加angular色和function>下一个下一个下一个,直到你到达function>在.NET(每个版本)勾选HTTP激活。 还要注意有一个隐藏在>网> WCF服务。

这然后立即工作! 那正在融化我的大脑

[HttpPost]是不必要的!

 [Route("")] public void Post(ProductModel data) { ... } 

我无法解决这个问题。 只要POST返回void(ASP.NET 4.0 – WEBAPI 1),我就启用了CORS并工作。 当我试图返回一个HttpResponseMessage时,我开始获取HTTP 405响应。

根据Llad的回答,我看了一下自己的参考资料。

我有我的POST方法上面列出的属性[System.Web.Mvc.HttpPost]。

我改变了这个使用:

 [System.Web.Http.HttpPostAttribute] [HttpOptions] public HttpResponseMessage Post(object json) { ... return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; } 

这固定了我的困境。 我希望这可以帮助别人。

为了完整起见,我在web.config中有以下内容:

 <httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" /> <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" /> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol> 

检查你的项目.csproj文件并更改

 <IISUrl>http://localhost:PORT/</IISUrl> 

到你的网站这样的url

 <IISUrl>http://example.com:applicationName/</IISUrl> 

导致相同行为的另一个可能的问题是路由中的默认参数。 在我的情况下,控制器被正确定位和实例化,但由于指定的默认Get操作,POST被阻止:

 config.Routes.MapHttpRoute( name: "GetAllRoute", routeTemplate: "api/{controller}.{ext}"/*, defaults: new { action = "Get" }*/ // this was causing the issue );