Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add Web API controller to an existing ASP.NET Core MVC?

Tags:

I created a project using the default ASP.NET Core MVC template. I would like to also create a RESTful API under /api/{Controller}. I added a new Web API controller (standard Web API controller class template) but I can't call it. I get an error saying that the page cannot be found. I tried adding a route in Startup.cs but it doesn't do anything:

app.UseMvc(routes => {     routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");     routes.MapRoute(name: "api", template: "api/{controller=Admin}"); }); 

EDIT:

Like I said, it's all default templates. Here's the Web API Controller that I added:

[Route("api/[controller]")] public class AdminController : Controller {                     // GET api/values/5     [HttpGet("{id}")]     public string Get(int id)     {         return "value";     }      // POST api/values     [HttpPost]     public void Post([FromBody]string value)     {     }      // PUT api/values/5     [HttpPut("{id}")]     public void Put(int id, [FromBody]string value)     {     }      // DELETE api/values/5     [HttpDelete("{id}")]     public void Delete(int id)     {     } } 
like image 790
Alex G. Avatar asked Jul 04 '17 22:07

Alex G.


People also ask

Can I add API controller to MVC project?

If you have MVC project and you need to add Web API controller to this project, it can be done very easy. 1. Add Nuget package Microsoft.

How do I set up a new API controller?

In Solution Explorer, right-click the Controllers folder. Select Add, then select Controller. In the Add Scaffold dialog, select "Web API 2 Controller with actions, using Entity Framework". Click Add.


2 Answers

Two things.

First, when using convention-based routing, more specific routes should come before more generic routes to avoid route conflicts.

app.UseMvc(routes => {     routes.MapRoute(name: "api", template: "api/{controller=Admin}");     routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); 

Secondly, you are already using attribute routing on the controller so should have been able to route to the controller except for the fact that you do not have a routing template on the controller that would accept /api/{Controller}

That would require a default route.

[Route("api/[controller]")] public class AdminController : Controller {       [HttpGet("")] //Matches GET api/admin <-- Would also work with [HttpGet]     public IActionResult Get() {         return Ok();     }      [HttpGet("{id}")] //Matches GET api/admin/5     public IActionResult Get(int id) {         return Ok("value");     }          //...other code removed for brevity } 
like image 123
Nkosi Avatar answered Sep 28 '22 11:09

Nkosi


I had luck doing this with v3.1:

Add Folder Controllers to the project. Add Controller, named TestController, to the folder. Then add the following to the Startup.cs:

services.AddControllers(); 

to

public void ConfigureServices(IServiceCollection services)     {         services.AddRazorPages();         services.AddControllers();     } 

and:

endpoints.MapControllers(); 

to

app.UseEndpoints(endpoints =>         {             endpoints.MapRazorPages();             endpoints.MapControllers();         }); 

Then I was able to call /api/Test.

like image 39
Ricardo May Avatar answered Sep 28 '22 12:09

Ricardo May