【问题标题】:ASP.NET MVC 4 AttributeRouting Per-Route DelegatingHandlerASP.NET MVC 4 AttributeRouting Per-Route DelegatingHandler
【发布时间】:2025-11-28 13:35:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否举一些例子说明您的委托处理程序将做什么?

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


【解决方案1】:

根据AttributeRouting website,它不支持WebApi下的一些特性,包括自定义处理程序。想想你可能不走运。

小心!由于与 Web API WebHost 框架的集成问题, 以下功能将不起作用:

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

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

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,但如果您的需求很简单,它可能是一种选择。

【讨论】:

  • 感谢@SimonC。目前我只需要两个自定义处理程序,基本上每个控制器都需要检查身份验证,除了在注册访问时,不会提供哪些凭据。我想我将简单地在全局注册我的处理程序(GlobalConfiguration.Configuration.MessageHandlers.Add(DependencyResolver.Current.GetService());),然后添加一些简单的逻辑来检查用户是否正在注册。正如您所看到的,如果以后需要更多的处理程序,这可能会变得很笨重。
  • Np @crizzycrizzz。全局应用处理程序(或作为全局过滤器),然后装饰未经身份验证的控制器以允许匿名访问怎么样。检查执行此操作的 [System.Web.Http.AllowAnonymous] 属性。
  • 如果我可以在我的路由上说 [Handler(new MyCustomHandler())] 并让 AttributeRouting 抓取该属性并在注册自定义路由时分配它,那将是愚蠢的;似乎微不足道。
  • @crizzwald,我建议你 fork AttributeRouting 并添加该功能。
  • 从头开始。我终于发现 AttributeRouting 已合并到 v5 RTM of ASP.NET (处于测试阶段)。所以你会想在那里检查你想要的任何功能。