Search code examples
asp.net-web-apiattributerouting

Web API 2 attribute routing returning 404


I'm having trouble getting the Web API 2 attribute routing to work. I've been trying everything I could find this whole evening but I can't find the problem.

What I want to achieve is the following: Make a POST request to http://localhost:xxxx/api/chat/joingroup/1234 to get to the following API call:

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

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

}

This keeps getting me a http 400 message.

{"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."}

But sending a post to: http://localhost:41021/api/chat/sendmessage/pm/123123 and also to http://localhost:41021/api/chat/joingroup gives me a 200

The chatcontroller:

[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 POSTS to http://localhost:xxxx/api/chat/sendmessage are working fine. I cannot figure out why it isn't going to the correct method when I'm calling a POST on http://localhost:xxxx/api/chat/joingroup/1234.

SOLUTION:
The solution was to reference both values that are needed in the JoinGroup method, id and connectionID. Now the request will hit this method. Using: http://localhost:xxxx/api/chat/joingroup/john?connectionid=123 will work.


Solution

  • I noticed two things on the code you sent through:

    1. the path you POST to is: localhost:xxxx/joingroup/1234 , this should be localhost:xxxx/api/chat/joingroup/1234
    2. because you have 2 parameters for the joingroup, you will need to pass both of them through, may be like this localhost:xxxx/api/chat/joingroup/1234?connectionID=value or you can pass it on the request body

    if the connectionID is optional you can modify the method to use option al parameters like this

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

    please let me know if this helps. Thanks Ashraf