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 );
- 如何开发一个ASP.NET Web API接受一个复杂的对象作为参数?
- System.Web.Http.Authorize与System.Web.Mvc.Authorize
- 使用自定义用户数据库的Web API令牌authentication
- 当它返回IHttpActionResult时,如何unit testingweb api操作方法?
- 如何在Web API控制器中获取基本URL?
- 如何在Web API消息处理程序中提取自定义标题值?
- ASP.NET Web API – 不允许PUT&DELETE动词 – IIS 8
- 将Web API添加到现有的MVC Web应用程序后发生404错误
- 在ASP.NET Web API中处理ModelStatevalidation