首页 > 解决方案 > 我要添加哪些路由,以便我可以将 MVC 和 Web API 与默认 Get 和附加操作混合使用?

问题描述

我正在构建一个混合的 asp.net 应用程序,它有一个 mvc 控制器和一个 web api 控制器。我阅读了文档,但无法让 web api 控制器默认匹配。

这是我的映射路线:

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

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

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

以下是不匹配并返回 HTTP 500 的操作:

    [HttpGet("{id:int}")]
    public IActionResult Get(int id)
    {
        try
        {
            //EF Core statement that returns data is here

            return Ok(data);
        }
        catch(Exception ex)
        {
            return BadRequest();
        }

    }

这个匹配很好:

    [Route("ProjectRoles/{id:int}")]
    [HttpGet("{id:int}")]
    public IActionResult ProjectRoles(int id)
    {
        try
        {
            //EF Core that gets data
            if (data == null)
                return NotFound(id);
            else
                return Ok(data.ProjectRoles);
        }
        catch (Exception ex)
        {
            return BadRequest();
        }
    }

标签: asp.net-core

解决方案


您不需要在启动时添加额外的路由。默认情况下,您可以在 asp.net core MVC 项目中同时使用 MVC 和 Web Api 控制器。只需在 vs 中右键单击 Controllers 文件夹时创建一个新的 Web api 控制器。

唯一的事情是在你的 web api 控制器中配置属性路由,比如

[Route("api/[controller]")]
[ApiController]
public class ProjectRolesController : ControllerBase
{
    // GET: api/ProjectRoles
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/ProjectRoles/5
    [HttpGet("{id}", Name = "Get")]
    public string Get(int id)
    {
        return "value";
    }

启动.cs:

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

推荐阅读