2014-05-06 174 views
16

我有一个Web API项目,我无法对它启用“PUT/Patch”请求。Web API - 405 - 请求的资源不支持http方法'PUT'

我从小提琴手得到的回应是:


HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: GET,POST,DELETE 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?= 
X-Powered-By: ASP.NET 
Date: Tue, 06 May 2014 14:10:35 GMT 
Content-Length: 72 

{"message":"The requested resource does not support http method 'PUT'."} 

基于上述回应,“PUT”动词是不能接受的。但是,我无法确定相关处理程序的配置位置。

类的“放”的方法声明如下:

[HttpPatch] 
[HttpPut] 
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel) 
{ 
    bla, bla, bla, bla 
} 

我已阅读并实施的更改在以下主题解释说: - Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings - http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

什么都没有做过在尝试针对我的Web API项目发出“PUT”命令时,我仍然收到了405响应。

我甚至在ApplicationsHost.config文件中注释掉了所有“Handlers”。

使用VS2012 Premium和IIS Express(我假设它是版本8)。我也尝试过VS Dev Server,但也给了我相同的结果。

我出来的想法。任何帮助,将不胜感激。

感谢李

回答

0

你应该在你的网络服务器配置进行配置。这取决于网络服务器的类型,你可以在哪里做到这一点。例如通过IIS,您可以使用web.config文件在文档根目录中执行该操作。通过跨域请求,您必须将CORS头添加到响应中,以允许来源,方法等...

注意:也许您可以使用ASP.NET框架做些什么,但是我也可以认为它不同。

0

添加以下部分下处理器部分在web.config中:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

例如:

<handlers> 
    <remove name="WebDAV" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 
20

是否使用属性路由?

这个神秘的错误是路由属性问题。这是在你的WebAPIConfig启用为:

config.MapHttpAttributeRoutes(); 

原来网页API控制器“不能承载的基于动词的动作方式和传统动作名称路由的混合物。” https://aspnetwebstack.codeplex.com/workitem/184

简而言之:我需要在我的API控制器中用[Route]属性标记我的所有操作,否则当试图通过传统路由找到它时,操作是“隐藏”(405'd)。

API控制器:

[RoutePrefix("api/quotes")] 
public class QuotesController : ApiController 
{ 
    ... 

    // POST api/Quote 
    [ResponseType(typeof(Quote))] 
    [Route] 
    public IHttpActionResult PostQuote(Quote quote) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     db.Quotes.Add(quote); 
     db.SaveChanges(); 

     return CreatedAtRoute("", new { id = quote.QuoteId }, quote); 
    } 

注:我的路线是无名所以CreatedAtRoute()的名字只是一个空字符串。

WebApiConfig.cs:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

    } 
} 

希望这有助于

+0

对我来说也是不幸的。这是同样的问题。 –

+0

+1,用于提供CodePlex中报告问题的链接。您也可以找到2个不同的链接,以获得可能的解决方法。由于问题没有解决就关闭了,所以我更喜欢在没有任何解决方法的情况下管理它,以避免过度设计我的Web API;) –

+0

谢谢! 在PUT和POST上添加[Route](它在那里丢失)解决了我的问题。最后,关于web api路由的重要信息! – ticky

7

我有完全相同的问题,因为你,我尝试了所有你尝试过的事情,但有时该解决方案是如此微不足道,你的下鼻子,你只是不期望它,并继续寻找更复杂的原因。确保在您要调用的url测试web方法时,参数名称与您的控制器方法声明中的名称相匹配。我的405问题通过简单地这样做解决了(我用的是查询参数):

我clientsController:

... 

[HttpPut] 
public string PutClient(string username = "", string phone= ""){...} 

在我WebApiConfig:

// Web API routes 
config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}" 
); 

,并用于测试方法的路径必须是这样的:(使用邮差或类似的,应用正确的网络方法)

http://localhost:49216/api/clients?username=Kurt&phone=443332211 

其他ise,你会在那个控制器里得到一个405的http方法。我根本不需要更改web.config(不需要删除webdav等)。检查this源文档中:

例如,请考虑以下操作:

公共无效的get(INT ID)

id参数绑定到URI。因此, 此操作只能匹配路由字典或查询字符串中包含“id”, 值的URI。

可选参数是一个例外,因为它们是可选的。对于 可选参数,如果绑定无法从URI获得值 ,那么可以。

+0

同样在这里。传递错误的参数名称并搔了我一个小时! –

1

这也是如果您忘记将API控制器上的Put()方法设为public时返回的错误消息。事后看来这显而易见,但却让我头部划了十分钟。

1

有同样的问题,我需要做的三件事情来解决这个问题:

  1. 禁用webdav的在<modules><handlers>
  2. 确保HttpPut从System.Web.Http,而不是从系统。网页。MVC使用的WebAPI
  3. 使ExtensionlessUrlHandler这样

<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" />

希望这可以帮助一些你解决这个问题,讨厌...

2

这个答案解决了该问题对我来说。我必须添加Route属性,问题就解决了。

[HttpPut] 
    [Route("")] 
    public HttpResponseMessage MyMethod() 
1

这发生在我身上时,我改变了PUT方法的第一个参数名称

public void Put(int code, [FromBody]Lead lead) 

它应该是:

public void Put(int id, [FromBody]Lead lead) 

,这是它如何被称为:

$.ajax({ 
    type: "PUT", 
    data: json, 
    url: "../api/leadsapi/123", 
    contentType: "application/json; charset=utf-8" 
}); 
相关问题