2013-03-30 136 views
55

这个错误是很常见的,我尝试了所有的解决方案,而不是他们的工作。我在控制面板中禁用WebDAV发布,并将此向我​​的网络配置文件:405方法不允许web api

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

而这正是引发异常:

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 

有什么建议?

回答

39

您从客户张贴:

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

不PUTing。

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

所以:

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

这不回答你的具体问题,但是当我有同样的问题,我在这里结束了,我计算过,更多的人可能会做同样的。

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

错误:

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

正确:

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

我有同样的例外。我的问题是,我用了:

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"; 
} 
+1

不断让我这一个! – Rick

+0

这解决了我的问题。谢谢... – Ziggler

+0

这解决了我的MVC API属性不起作用。谢谢! – Alexei

8

我的问题竟然是在的WebAPI属性的路由。我创建了一个自定义路由,它对待它就像发现它是一个POST

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

一个GET代替的WebAPI我知道它是什么愚蠢的(消耗你一整天)

1

[HttpPost]是不必要的!

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

是的,你这样做的方式是正确的,你不需要一个明确的[HttpPost],但是有一些人不遵循约定(yikes),因此像[Route(“MyMethodSaver”]公共字符串MyMethodtoSave(int ?]这将需要一个[HttpPost],然后它会工作 –

16

我尝试过很多事情让DELETE方法的工作(我得到405方法不被允许网页API),最后我说[路线(“API /扫描/(编号)”)我控制器,工作正常。 希望这篇文章有助于某人。

 // 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); 
    } 
+0

由于某种原因,我只是不工作的删除,创建和更新它工作正常。嗯,我只是添加了[HttpPost]和它但是谢谢,你让我走上了正轨,只花了我5分钟:) – Rubenisme

+0

为什么你不加入[HttpDelete]属性? –

4

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

4

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

public void Options() { } 
+0

这是我的问题,谢谢!你促使我检查请求,并且这是OPTIONS调用失败的原因 –

4

如果说你的方法需要一个参数而你没有通过,你也可以得到405错误。

这不起作用(405错误)

HTML查看/ JavaScript的

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

的Web API:

public HttpResponseMessage GetNews(int id) 

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

查看HTML/JavaScript的

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

由于各种原因,我似乎遇到了405错误,它们都归结为它尝试HIT方法签名和一个事实参数问题或约定命名问题或属性问题等...... –

1

我没法解决这个问题。只要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> 
2

,我迟到了这个党,但如无上述要么是活的或在大多数情况下工作,这里是如何这终于为我解决了。

在站点/服务托管的服务器上,需要一项功能! HTTP激活!

服务器管理器>管理>添加角色和功能>下一个下一个下一个,直到您到达功能>在.NET(每个版本)下勾选HTTP激活。 另请注意,有一个隐藏在>网> WCF服务。

然后,这即刻工作! 那是融化了我的大脑在你的项目

0

检查的.csproj文件,并更改

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

到您的网站的网址是这样

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

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

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

如果你有一个像

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

您需要使用完全相同的路线方法中的参数名称例如

public ReactorModel GetReactor(reactorId) 
{ 
... 
} 

如果不通过完全相同的参数,您可能会收到错误“405方法不允许”,因为该路线将不匹配的请求,并会的WebAPI击中不同的允许HTTP方法不同的控制器方法。

+0

这也不是一个答案! –

+0

@Div“405方法不允许”可以在我共享的情况下显示,因为该方法无法捕捉API呼叫,因为路由设置无效。然后,API调用可能会碰到另一种意想不到的方法,该方法可能会允许不同的HTTP操作。是的,我同意这个答案可能与实际问题不是100%相关,但是Xardas提出的问题的标题并不是非常具体,我相信很多人在此寻找标题所述问题的答案找到这个有用的答案。 – roylac

1

这里是一个解决方案

<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>

docs.microsoft.com solution article

和删除的WebDAV从模块

<remove name="WebDAVModule" />

1

当您尝试同时连接到http也会出现此错误服务器在https上。

这有点令人困惑,因为我的请求没问题,问题只出现在post-requests中。