在{controller}之前插入一个路由参数

时间:2019-05-07 16:44:13

标签: c# asp.net-core asp.net-core-mvc asp.net-core-webapi

我有一个带有一堆控制器的有效API,并且在配置文件中指定了一个数据库。 现在,我要使API成为多数据库,并使目标数据库成为URL的一部分。

我现在在控制器上使用属性,并使用默认路由。

Startup.cs:

app.UseMVC(); 

FolderController.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}

我已经可以通过将controller属性更改为以下内容来提取数据库名称:

[Route("{database}/[controller]")]

但是然后我必须在每个操作方法中插入代码以检查路由等,否则可能会(在额外的输入之外)故意不执行它。

理想情况下,我想将此添加到startup.cs中的默认路由,并向中间件添加服务,该服务将检查所请求数据库上已认证用户的特权,并在适当时继续进行。这样,我就可以将安全性放在一个地方,而又无法在控制器中忘记它。

我还无法弄清楚如何将其与属性混合使用,它们似乎相互冲突。

可以做到吗?有没有人对我有帮助?

1 个答案:

答案 0 :(得分:0)

据了解,我知道我们可以做到。您需要实现IHttpHandler。 您可以参考以下示例https://www.c-sharpcorner.com/article/dynamic-and-friendly-url-using-mvc/