ASP.NET MVC 4 WebApi条件MessageHandlers

时间:2012-03-29 02:36:43

标签: c# asp.net-mvc-3 asp.net-mvc-4 asp.net-web-api

在以前版本的WebApi中,您可以执行以下操作:

RouteTable.Routes.MapServiceRoute<UserService>("1.0/User/", defaultWebApiConfiguration);
RouteTable.Routes.MapServiceRoute<SomeOtherService>("1.0/SomeOtherService/", largeFilesConfig);

这将允许您在不同的服务上使用不同的消息处理程序。这在新框架中显然是不可能的:ASP.NET MVC 4 WebApi Support For Multiple HttpConfigurations

或者我有项目,我在RequestHandlers中编辑了WebApiConfiguration以添加处理程序,如果某些属性存在,则:

    public static void AppendAuthorizationRequestHandlers(
  this WebApiConfiguration config)
{
  var requestHandlers = config.RequestHandlers;
  config.RequestHandlers = (c, e, od) =>
  {
    if (requestHandlers != null)
    {
      requestHandlers(c, e, od); // Original request handler
    }
    var authorizeAttribute = od.Attributes.OfType<RequireAuthorizationAttribute>()
      .FirstOrDefault();
    if (authorizeAttribute != null)
    {
      c.Add(new AuthOperationHandler(authorizeAttribute));
    }
  };
}

该代码基于:http://haacked.com/archive/2011/10/19/implementing-an-authorization-attribute-for-wcf-web-api.aspx。由于MessageHandlers上的HttpConfiguration无法设置,因此无法再进行此操作。

总结一下,我的问题是如何指定某些消息处理程序仅适用于某些ApiController服务而不是所有服务。似乎ASP.NET MVC 4 WebApi框架已经过度简化了Web Api Beta的功能和可配置性。

1 个答案:

答案 0 :(得分:0)

在新的Web API中实现此目的的推荐方法是使用操作过滤器属性。它们的工作方式与MVC中的方式非常相似,但您使用一组新的基类来实现它们。最简单的入门方法是从ActionFilterAttribute派生。