【发布时间】:2023-04-02 22:16:01
【问题描述】:
我正在尝试在我的网关上创建一个控制器,除了将请求代理到另一个 API 之外,它几乎什么都不做。 (它做了一些其他非常基本的准备工作,但这有点超出了这个范围,所以我把它省略了)。这之前由大约 20 个控制器处理,它们都做同样的事情,所以我试图简化事情。
[Route("api/reporting/route1")]
[Route("api/reporting/route2")]
public class TestController : Controller
{
[HttpPost("{clientId:int")]
public async Task<ActionResult<MemoryStream>> GetReport(int clientId, [FromBody] object requestBody)
{
var report = await ReportingClient.DownloadReport(/*HERE*/, requestBody);
return File(report, "application/pdf");
}
}
目的地完全由到达该控制器的路线决定。
即route1 可以转至api/reporting/test/1,route2 可以转至api/test/2。
已经存在的内容并不像我想要的那样一致,但让它们保持一致超出了我的范围。
因此,我希望能够使用将Route 与任意Target 字符串相结合的属性来装饰我的控制器。
类似这样的:
[ProxyRoute("api/reporting/route1", "api/reporting/test/1")]
[ProxyRoute("api/reporting/route2", "api/test/2")]
public class TestController : Controller
{
[HttpPost("{clientId:int")]
public async Task<ActionResult<MemoryStream>> GetReport(int clientId, [FromBody] object requestBody)
{
var report = await ReportingClient.DownloadReport(Target, requestBody);
return File(report, "application/pdf");
}
}
当然,我可以在我的类中包含一个静态只读字典来实现这一点,但我觉得这比较麻烦,所以如果可以的话,我想用一个属性来做。
我将如何实现这一目标?
【问题讨论】:
标签: c# routes custom-attributes