IT-Swarm.Net

Wie Hinzufügen eines Web-API-Controllers zu einem vorhandenen ASP.NET Core-MVC?

Ich habe ein Projekt mit der Standard-MVC-Vorlage von ASP.NET Core erstellt. Ich möchte auch eine RESTful-API unter /api/{Controller} erstellen. Ich habe einen neuen Web-API-Controller (Standardvorlage für Web-API-Controller-Klassen) hinzugefügt, kann ihn aber nicht aufrufen. Ich erhalte die Fehlermeldung, dass die Seite nicht gefunden werden kann. Ich habe versucht, eine Route in Startup.cs hinzuzufügen, aber es macht nichts:

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

BEARBEITEN:

Wie ich schon sagte, es sind alle Standardvorlagen. Hier ist der Web API Controller, den ich hinzugefügt habe:

[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)
    {
    }
}
10
Alex G.

Nach der Aktualisierung auf die neueste Version von ASP.NET Core, Version 2.0.1 (der Version, die VS2017 benötigt), wurde das Problem behoben. Ich denke, es war wahrscheinlich ein Fehler oder ein Mangel in der alten Version.

2
Alex G.

Zwei Dinge.

Erstens sollten bei konventionsbasiertem Routing spezifischere Routen vor allgemeineren Routen stehen, um Routenkonflikte zu vermeiden.

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

Zweitens verwenden Sie bereits Attribut-Routing auf dem Controller. In diesem Fall hätten Sie das Routing an den Controller weiterleiten können, mit der Ausnahme, dass Sie auf dem Controller keine Routenvorlage haben, die /api/{Controller} akzeptiert.

Dies würde eine Standardroute erfordern

[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
}
5
Nkosi

Versuchen Sie, den Namen "Admin" einzustellen.

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "Admin",
                template: "api/{controller=Admin}");
        });
0
William Han

Wenn noch immer Probleme beim Hinzufügen von Webapi zu .net Core MVC auftreten, fügen Sie einfach [ApiController] und [Route("api/[controller]")] Attribute ein, bevor die Klasse das Problem löst:

[Route("api/[controller]")]
[ApiController]
public class ListController
{ ... }

Ich habe keine Routenzuordnung in Startup.cs hinzugefügt und funktioniert trotzdem gut. Die von mir verwendete Version von .net ist 2.1.402

0
Kevin Youn