Web API 2属性路由返回404

时间:2014-12-23 21:48:34

标签: asp.net-web-api attributerouting

我无法使Web API 2属性路由工作。 我一直在尝试整个晚上都可以找到的一切,但我找不到问题。

我想要实现的目标如下: 向http://localhost:xxxx/api/chat/joingroup/1234发出POST请求以进入以下API调用:

[Route("joingroup/{id}")]
[HttpPost]
public async Task<IHttpActionResult> JoinGroup(string id, string connectionID)
{
    await hubContext.Groups.Add(connectionID, id);

    return Ok(hubContext.Groups.ToString());

}

这让我不断收到一条http 400消息。

{"message":"No HTTP resource was found that matches the request URI 'http://localhost:41021/api/chat/joingroup/123'.",
"messageDetail":"No action was found on the controller 'Chat' that matches the request."}

但是发送帖子到:http://localhost:41021/api/chat/sendmessage/pm/123123http://localhost:41021/api/chat/joingroup给了我一个200

聊天控制器:

[RoutePrefix("api/chat")]
public class ChatController : ApiController
{
    IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
    [...]

    [Route("joingroup/{id}")]
    [HttpPost]
    public async Task<IHttpActionResult> JoinGroup(string id, string connectionID)
    {
        await hubContext.Groups.Add(connectionID, id);

        return Ok(hubContext.Groups.ToString());

    }

http://localhost:xxxx/api/chat/sendmessage的HTTP POSTS工作正常。 当我在http://localhost:xxxx/api/chat/joingroup/1234上调用POST时,我无法弄清楚为什么它没有采用正确的方法。

SOLUTION:
解决方案是引用JoinGroup方法,id和connectionID中所需的两个值。现在请求将命中此方法。 使用: http://localhost:xxxx/api/chat/joingroup/john?connectionid=123可以使用。

2 个答案:

答案 0 :(得分:1)

我注意到你发送的代码有两件事:

  1. 你发布的路径是:localhost:xxxx / joingroup / 1234,这个 应该是localhost:xxxx / api / chat / joingroup / 1234
  2. 因为你有两个joingroup参数,你需要传递它们两个,可能就像这个localhost:xxxx / api / chat / joingroup / 1234?connectionID = value或者你可以在请求体上传递它
  3. 如果connectionID是可选的,您可以修改方法以使用选项al参数,例如

    public  string JoinGroup(string id, string connectionID = "")    
    

    如果有帮助,请告诉我。 谢谢 阿什拉夫

答案 1 :(得分:1)

我假设connectionID参数引用了POSTed数据。最简单的方法是使用[FromBody]属性对其进行修饰,并在发送的值前添加=,如下所示:=MyConnection1

Web API需要具有属性的对象或其他数组。或者,您可以使用自定义类包装连接ID,并将其序列化为JSON / XML。