【问题标题】:ASP.NET MVC 4 WebApi Conditional MessageHandlersASP.NET MVC 4 WebApi 条件消息处理程序
【发布时间】:2012-03-29 02:36:42
【问题描述】:

在以前版本的 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

另外,我有一些项目,我在 WebApiConfiguration 中编辑了 RequestHandlers,以便在某些属性存在时添加处理程序:

    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。这不再可能,因为HttpConfiguration 上的MessageHandlers 不可设置。

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

【问题讨论】:

  • 如果您自己托管,您可以创建多个服务。目前在 Web 主机中没有办法。

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


【解决方案1】:

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

【讨论】:

  • 是的。我熟悉动作过滤器,但在我的一个案例中,我有一个消息处理程序,它也称为 ContinueWith,所以流程是调用消息处理程序,然后是实际服务,然后是消息处理程序。很酷的事情是我能够将变量从入口消息处理函数传递到出口消息处理函数。这对于 OnActionExecuting 和 OnActionExecuted 是不可能的,因为您不能将变量从 Executing 传递给 Executed 函数。
  • 看起来 ActionArguments 可能是一个解决方案。
  • @nextgenneo ActionArguments 是将传递给操作方法的参数。不要用那个。相反,请使用HttpRequestMessage.Properties
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2014-02-20
  • 2016-09-24
  • 1970-01-01
相关资源
最近更新 更多