asp.net-core - 我要添加哪些路由,以便我可以将 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 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?}");
});
推荐阅读
- angular - 不要从 fetch api 分配数据
- node.js - 当我在浏览器中运行 firebase 功能时,出现 403 错误
- python - 如何使用python更改终端中的目录?
- python - Python Pandas:如何检索多个值的行索引
- android - Camera2 API 上相同的分辨率比例下视角不同
- javascript - 如何在插入表之前检查csv文件是否有重复值
- sql - 通过在 mssql 中合并另一个表来更新空值
- css - 如何创建具有固定和自动包装的弹性元素的弹性框?
- python - 加入一个充满元组而不是字符串的列表
- cefsharp - CEF 是否支持 NPAPI 插件?