ASP.NET MVC 4 AttributeRouting Per-Route DelegatingHandler

时间:2013-04-03 04:28:19

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

我正在使用nuget包http://nuget.org/packages/AttributeRouting/并为我的web api指定了自定义路由。当我尝试在WebApiConfig中向我的路由添加自定义委托处理程序(dh)时,我的dh永远不会被调用。这是有道理的,因为dh被分配到默认路由,而不是分配给我用web api控制器装饰的自定义路由。我能够全局注册dh并执行它,但是,我想在每条路径上注册自定义dh(不同的路由需要做不同的事情,我不想把大量的逻辑放到一个全局dh中)。 / p>

在使用AttributeRouting包时,有没有人知道如何做到这一点?我搜索了网站上的文档,但没有找到任何内容。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

根据AttributeRouting website,它不支持WebApi下的某些功能,包括自定义处理程序。认为你可能运气不好。

  

小心!由于Web API WebHost框架的集成问题,   以下功能无效:

     

匹配路线,自定义路线处理程序时的性能增强,   查询字符串参数约束,子域路由,本地化   应用于入站/出站网址,小写,附加前缀,   等生成的路线。这些功能都必须等待vNext   Web API。

如果您不需要AttibuteRouting提供的所有扩展路由,您可以使用自己的路由属性,然后在启动期间根据该路由属性注册路由。 e.g:

public class RouteAttribute : Attribute
{
    public string Value { get; private set; }

    public RouteAttribute (string value)
    {
        Value = value;
    }
}

然后根据控制器中的装饰类或操作注册路径:

    foreach (var controllerType in controllers)
        {
        var attributes = System.ComponentModel.TypeDescriptor.GetAttributes(controllerType);
        var uriattribute = (RouteAttribute)attributes[typeof(RouteAttribute)];
        var controllerName = controllerType.Name.Replace("Controller", "");

        string uri = uriattribute.Value;

        config.Routes.MapHttpRoute(
            name: controllerName,
            routeTemplate: uri,
        handler: new YourCustomHandler()
        }
    }

显然你不想重写AttributeRouting,但如果你的需求很简单,那么它可能是一个选择。