【发布时间】:2019-05-08 02:59:59
【问题描述】:
我有一个带有一堆控制器的工作 API,在配置文件中指定了一个数据库。 现在我想制作API多数据库并使目标数据库成为url的一部分。
我现在在控制器上使用属性和默认路由。
Startup.cs:
app.UseMVC();
文件夹控制器.cs:
[Route("api/[controller]")]
[ApiController]
public class FoldersController : ControllerBase { ...
和控制器上的操作:
[HttpGet("{Parent:Guid}", Name = "Get")]
public IActionResult Get(Guid Parent) {...
所以给我的是标准的整体模板,看起来像这样:
https://api.example.com/api/{controller}/{action}
我想要的是使数据库成为 url 的一部分,直观的位置在控制器前面。我也可以跳过第二个api 位,因为我没有在该基地址上运行任何其他东西。
https://api.example.com/{database}/{controller}/{action}
我已经能够通过将控制器属性更改为来提取数据库名称:
[Route("{database}/[controller]")]
但是我必须在每个操作方法中插入代码来检查路由等,有可能无法始终如一地实现它(除了额外的输入)。
理想情况下,我想将此添加到startup.cs 中的默认路由中,并向中间件添加一个服务,该服务将检查所请求数据库上经过身份验证的用户的权限并酌情继续。这样我就可以将我的安全性放在一个地方,并且无法在控制器中忘记它。
我无法弄清楚如何将其与属性混合,它们似乎相互冲突。
这可以吗?有没有人有一些指示让我摆脱这个?
【问题讨论】:
-
我找不到常规的 MVC 等效项,但对于 razor 页面,我使用
IPageRouteModelConvention添加了路由的{database}部分。然后通过使用 `HttpContext.GetRouteData()' 在中间件中获取它。
标签: c# asp.net-core asp.net-core-mvc asp.net-core-webapi