【问题标题】:Web API 2 - Method now allowed(405) for PUTWeb API 2 - PUT 方法不允许(405)
【发布时间】:2016-06-20 08:04:39
【问题描述】:

我被 Web API 2 控制器卡住了,我从中调用 PUT 方法,它给了我一个错误,即不允许使用该方法。我在Web.config 中添加了阻止WebDAV 阻止方法的代码行。我尝试了一切,但它不起作用。这可能是我在控制器中的PUT 方法的问题。

这是我的控制器代码:

public IHttpActionResult Put(int id, [FromBody]ArticleModel model) {
    var article = _articleService.UpdateArticle(model);
    return Ok<ArticleModel>(article);
}

这是我调用 put 的代码:

  response = await client.PutAsJsonAsync("api/article/2", articleModel);

在此代码之前,我将客户端定义为 http 并添加了所需的属性,并调用了其他控制器方法(GET、POST、DELETE),它们都可以工作。这是来自 Windows 窗体应用程序,我也从 Postman 调用,但仍然是同样的错误。

【问题讨论】:

  • 我认为你只是混淆了PostPut。您确实可以对两个动词使用相同的操作,但我个人认为这在 Web 应用程序中不是一个好的做法(Post 是用来创建新实体的,应该使用 Put 来更新它)。但是,您可以使用这两个动词来访问该操作。例如,this link
  • 是Put,我打错了.. :(
  • 您是如何创建PUT 请求的?通过自定义客户端?通过网页?通过 Postman/Fiddler 这样的开发工具?
  • 从邮递员调用....但也从 Windows 窗体应用程序调用,仍然是同样的错误

标签: c# asp.net webapi2


【解决方案1】:

[HttpPut][RoutePrefix("api/yourcontroller")][Route("put")] 属性添加到您的控制器方法中

例子:

[RoutePrefix("api/yourcontroller")]
public class YourController
{
 [HttpPut]   
 [Route("{id}/put")]
 public IHttpActionResult Put(int id, [FromBody]ArticleModel model) {
   var article = _articleService.UpdateArticle(model);
   return Ok<ArticleModel>(article);
 }
}

编辑 1

public class YourController
{
 [HttpPut]   
 [Route("api/article/{id}/put")]
 public async Task<HttpResponseMessage> Put(int id, [FromBody]ArticleModel model) {
   var article = _articleService.UpdateArticle(model);
   return Ok<ArticleModel>(article);
 }
}

从您的 HttpRequest 调用看来,预期的是 HttpResponseMessage 所以将返回类型更改为 async Task&lt;HttpResponseMessage&gt;

制作HttpRequest的代码:

response = await client.PutAsJsonAsync("api/article/2/put", articleModel);

【讨论】:

  • 请在问题中添加您提出请求的代码
  • 请看 EDIT 1
【解决方案2】:

[System.Web.Http.HttpPut] 属性添加到您的方法中。

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 2015-10-07
    • 2016-04-18
    • 2023-03-23
    • 2013-03-21
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多