【问题标题】:How to route to controller actions based on the value of a specific query string param?如何根据特定查询字符串参数的值路由到控制器操作?
【发布时间】:2019-09-23 09:01:03
【问题描述】:

我即将将旧的 PHP Web api 重写为 ASP MVC。 对旧版 api 的调用由名为“function”的第一个查询字符串参数区分,该参数基于函数参数具有可变数量的附加参数。

contoso.com/api.php?function=func1&param1=x&param2=y&...

我现在想根据这个参数将这些调用路由到不同的控制器操作,而不是让一个操作有条件地检查“函数”参数的值。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案1】:

    您可以制作自定义控制器选择器。基本上想法是,您首先制作处理程序,该处理程序将根据您拥有的自定义逻辑在您的控制器上路由您的请求(例如,您的逻辑可能是 - 如果请求具有函数参数 func1,那么您应该在 func1 控制器上路由您的请求。)

    你做处理程序:

    public class RouteSpecificHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.Properties["UseCustomSelector"] = true;
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    您制作控制器选择器:

    public class CustomSelector : DefaultHttpControllerSelector
    {
        public CustomSelector(HttpConfiguration configuration) : base(configuration)
        {
        }
    
        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            if (request.Properties.ContainsKey("UseCustomSelector") &&
                request.Properties["UseCustomSelector"] as bool? == true)
            {
                //your logic goes here
            }
    
            return base.SelectController(request);
        }
    }
    
    
    
    config.Routes.MapHttpRoute(
                name: "MyRoute",
                routeTemplate: "api/dummy/{id}",
                defaults: new {controller = "Dummy", id = RouteParameter.Optional},
                constraints: null,
                handler: new RouteSpecificHandler { InnerHandler = new HttpControllerDispatcher(config) }
                );
    

    您可以在此处查看更多信息: ASP.NET Web API custom IHttpControllerSelector for a single route

    【讨论】:

      【解决方案2】:
      public async Task<IActionResult>api(string func1,string param1,string param2)
      {
          //.....
      }
      

      请试试这个。

      【讨论】:

      • 这是我尽量避免的,因为有几个“功能”会使这个控制器动作非常混乱。相反,我希望有多个由函数参数的可能值命名的控制器操作。
      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 2022-11-24
      • 2017-09-01
      相关资源
      最近更新 更多