【问题标题】:How to fix - The requested resource does not support http method 'POST'如何修复 - 请求的资源不支持 http 方法“POST”
【发布时间】:2017-07-04 06:12:00
【问题描述】:

以下是 WebAPI 操作。在谷歌上搜索以下错误:-

请求的资源不支持http方法'POST'

我获得了链接数量并相应地更新了我的 api,但我仍然遇到同样的错误。

但是当通过 post man 调用上述内容时仍然会抛出错误。

我该如何摆脱这个错误??

在方法参数列表中不使用[FromBody] 属性也可以解决这个问题吗?

非常感谢任何帮助/建议。 谢谢。

【问题讨论】:

  • 很可能,还有另一个动作叫做“重命名”。并且 [Route("rename/{userId}/{type}/{title}/")] 与您的请求 url 不匹配。
  • @levent,已检查。没有这样的

标签: c# asp.net-web-api postman


【解决方案1】:

你已经声明了需要url参数的路由

[Route("rename/{userId}/{type}/{title}/")]

所以当您向api/customer/rename 发送请求时,它与此方法不匹配。您应该从路由参数中删除您在请求正文中传递的参数

[Route("rename")]

确保您的控制器上有适当的RoutePrefix("api/customer") 属性。


第二个问题是多个[FromBody] 参数。你会得到 can't bind multiple parameters 错误。存在限制 - 您只能将一个参数标记为 FromBody。见Sending Simple Types注:

Web API 最多读取一次请求体,所以只有一个参数 一个动作可以来自请求体。如果您需要获得多个 请求正文中的值,定义复杂类型。

您应该创建包含所有参数的复杂类型

public class RenameModel
{
   public int UserId { get; set; }
   public string Type { get; set; }
   public string Title { get; set; }
}

并将方法签名更改为

[HttpPost]
[Route("rename")]
public IHttpActionResult Rename(RenameModel model)

并将请求数据作为 application/x-www-form-urlencoded

发送

【讨论】:

  • 多个[FromBody] 很好,或者它可能是一个原因??
  • @Kgn-web 抱歉,不在。是的,这也是一个问题。更新了答案。确保路由前缀也是api/customer
  • 问题已修复。谢谢:)
【解决方案2】:
 [Route("rename/{userId}/{type}/{title}/")]
 public IHttpActionResult Rename([FromBody] int userId,  [FromBody] string  type, [FromBody] string title)

最后一个答案是正确的,您在路由中要求这些参数,但说您希望它们在帖子正文中。此外,通常路线会以名词而不是动词开头。你改名是什么? (即 [Route("users/rename/{userId}/{type}/{title}")]

根据你最初的帖子,试试这个:

 [HttpPost]
 [Route("rename/{userId}/{type}/{title}" Name = "RenameUser"]
 public IHttpActionResult Rename(int userId, string type, string title)
 {
     _myServiceMethod.Rename(userId, type, title);
     return new StatusCodeResult(HttpStatusCode.Created, this);   
 }

或者,如果您想在正文中发布信息: 声明您的数据合同:

public class User
{
    public string Type { get; set; }
    public string Title { get; set; }
}

然后在端点上:

[HttpPost]
[Route("rename/{userId}", Name = "RenameUserPost")]
public IHttpActionResult RenameUserPost(int userId, [FromBody] User userData)
{
    return new StatusCodeResult(HttpStatusCode.Created, this);
}

请注意,在这两个返回中,“this”指的是从 ApiController 继承的控制器类。大摇大摆地验证了这两个,它们接受 POST 并返回状态代码。

希望这会有所帮助。

【讨论】:

  • Name属性有什么用??
  • 多个 [FromBody] 很好,或者它可能是一个原因??
  • 路由命名用于生成链接,例如,如果您想使用 Created(Uri location, T Content) 响应类型,您可以使用手动路由助手或 Ploeh 之类的东西。 Hyprlinkr 通过路由名称动态获取 Uris。因此,如果您更改路线,链接仍然是正确的。
  • 我认为不允许使用多个 FromBody 属性。这可能是您的路线未上车的直接原因。也就是说,我还没有遇到过需要发布多个不同对象的实例。你的路线应该只处理一件事。在您的特定情况下,像上面第二个示例一样创建数据合同应该可以正常工作。
猜你喜欢
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2016-05-04
  • 2022-01-02
  • 2017-05-24
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多