user12585721
user12585721

Reputation:

Asp.Net Core Api Default Routing

I have a very basic Asp.Net Core Api; my controller looks like this:

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public IEnumerable<Resource> Test(string id)
    {
         // Breakpoint here
    }

I would expect the following URL to invoke the method, and fire the breakpoint:

https://localhost:5012/test/test/1

However, it doesn't. In fact, the following URL does:

https://localhost:5012/test/1

I was under the impression that the format for the URL was as follows (from startup):

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action=Index}/{id?}");
});

So, unless that action is Index:

https://localhost:5012/controller/action/id    

But it appears that the accepted format is:

https://localhost:5012/controller/id    

My question is, why is this?

Upvotes: 1

Views: 969

Answers (2)

SerhatDev
SerhatDev

Reputation: 241

In addition to pwrigshihanomoronimo answer,

you can just change this

[HttpGet("{id}")]
public IEnumerable<Resource> Test(string id)

to

[HttpGet("[action]/{id}")]
public IEnumerable<Resource> Test(string id)

Upvotes: 1

Yehor Androsov
Yehor Androsov

Reputation: 6162

Actually it is ApiController attribute, who breaks your routing. Looks like app.UseEndpoints configures routes just for MVC. So the solution is to remove all attributes to have the following code

public class TestController : ControllerBase
{
    public string Test(string id)
    {
        return "OK";
    }
}

Or, if you want to keep ApiController attribute, you would need to adjust Route value as well. You can remove app.UseEndpoints, if you don't use MVC in your project

[ApiController]
[Route("[controller]/[action]")]
public class TestController : ControllerBase
{
    [HttpGet("{id}")]
    public string Test(string id)
    {
        return "OK";
    }
}

Upvotes: 0

Related Questions