Web API - 405 - 请求的资源不支持http方法'PUT'

Lee*_*uhl 19 c# rest handler asp.net-web-api

我有一个Web API项目,我无法启用"PUT/Patch"请求.

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


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'."}
Run Code Online (Sandbox Code Playgroud)

根据上述回复,不接受"PUT"动词.但是,我无法弄清楚相关处理程序的配置位置.

类的"Put"方法声明如下:

[HttpPatch]
[HttpPut]
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel)
{
     bla, bla, bla, bla
}
Run Code Online (Sandbox Code Playgroud)

我已阅读并实现了以下主题中解释的更改: - Asp.NET Web API - 405 - 不允许用于访问此页面的HTTP动词 - 如何设置处理程序映射 - http://www.asp.net/web -API /概述/测试和调试/故障排除-HTTP-405-错误-后发布的Web-API的应用程序

没有任何工作,因为我在尝试对我的Web API项目发出"PUT"命令时仍然得到405响应.

我甚至在ApplicationsHost.config文件中注释掉了所有"处理程序".

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

我没有想法.任何帮助,将不胜感激.

谢谢李

pro*_*ock 23

你在使用属性路由吗?

这个神秘错误是一个路由属性问题.这在您的WebAPIConfig中启用为:

 config.MapHttpAttributeRoutes(); 
Run Code Online (Sandbox Code Playgroud)

事实证明,Web Api控制器"无法承载基于动词的动作方法和传统动作名称路由的混合."; https://aspnetwebstack.codeplex.com/workitem/184

简而言之:我需要使用[Route]属性在我的API控制器中标记我的所有操作,否则当尝试通过传统路由找到它时,操作将被"隐藏"(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);
    }
Run Code Online (Sandbox Code Playgroud)

注意:我的Route未命名,因此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 }
        );

    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


kur*_*urt 10

我和你有完全相同的问题,我尝试了你尝试的所有东西,但有时解决方案是如此微不足道,在你的鼻子下,你只是不指望它,并继续寻找更复杂的原因.确保在您调用的URL中测试Web方法时,param名称与控制器方法声明中的名称匹配.通过简单地执行此操作(我使用查询参数)解决了我的405问题:

我的客户控制器:

...

[HttpPut]
public string PutClient(string username = "", string phone= ""){...}
Run Code Online (Sandbox Code Playgroud)

在我的WebApiConfig上:

// Web API routes
config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}"
);
Run Code Online (Sandbox Code Playgroud)

用于测试方法的路径必须如此:(使用Postman或类似方法,应用正确的Web方法)

http://localhost:49216/api/clients?username=Kurt&phone=443332211
Run Code Online (Sandbox Code Playgroud)

否则,您将在该控制器中获得该方法的405.我根本不需要更改web.config(无需删除webdav等等).在文档中检查源代码:

例如,请考虑以下操作:

public void Get(int id)

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

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


Dan*_*nas 5

当我更改 PUT 方法的第一个参数名称时,发生了这种情况

public void Put(int code, [FromBody]Lead lead)
Run Code Online (Sandbox Code Playgroud)

它应该是:

public void Put(int id, [FromBody]Lead lead)
Run Code Online (Sandbox Code Playgroud)

这就是它的调用方式:

$.ajax({
    type: "PUT",
    data: json,
    url: "../api/leadsapi/123",
    contentType: "application/json; charset=utf-8"
});
Run Code Online (Sandbox Code Playgroud)


inf*_*rno 0

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

注意:也许您也可以使用 ASP.NET 框架对此做一些事情,但我认为它有所不同。