首页 > 解决方案 > 如何根据特定查询字符串参数的值路由到控制器操作?

问题描述

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

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

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

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

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

解决方案


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


推荐阅读