【问题标题】:Combine Route Attribute With Arbitrary String将路由属性与任意字符串组合
【发布时间】: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/1route2 可以转至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


    【解决方案1】:

    所以我实际上解决了这个问题......我认为我在脑海中过于复杂了。我只需要继承RouteAttribute 本身,然后将我的额外字符串添加为公共属性:

        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
        protected class ReportingProxyRouteAttribute : RouteAttribute
        {
            public string Destination    { get; }
            public ReportingProxyRouteAttribute(string template, string destination) : base(template)
            {
               Destination    = destination;
            }
        } 
    

    然后我可以自己获取额外的字符串:

        private ReportingProxyRouteAttribute GetRouteForRequest()
        {
           var possibleRoutes = Attribute.GetCustomAttributes(GetType(), typeof(ReportingProxyRouteAttribute)).Cast<ReportingProxyRouteAttribute>();
           return possibleRoutes.First(r => Request.Path.ToString().ToLowerInvariant().Contains(r.Template.ToLowerInvariant()));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-24
      • 2014-05-28
      • 2016-01-23
      • 2015-08-25
      • 2022-07-09
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多