Обработчики условных сообщений ASP.NET MVC 4 WebApi

В предыдущей версии WebApi вы могли сделать следующее:

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

Это позволит вам иметь разные обработчики сообщений в разных службах. Очевидно, это невозможно в новой структуре: ASP.NET MVC 4. Поддержка WebApi для нескольких конфигураций Http

В качестве альтернативы у меня были проекты, в которых я редактировал 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.


person Luke Belbina    schedule 29.03.2012    source источник
comment
Если вы самостоятельно размещаете, вы можете создать несколько сервисов. На данный момент нет способа в веб-хостинге.   -  person Darrel Miller    schedule 29.03.2012


Ответы (1)


Рекомендуемый способ добиться этого в новом веб-API — использовать атрибуты фильтра действий. Они работают почти так же, как и в MVC, хотя для их реализации используется новый набор базовых классов. Самый простой способ начать работу — получить из ActionFilterAttribute.

person marcind    schedule 29.03.2012
comment
Да. Я знаком с фильтрами действий, но в одном из моих случаев у меня был обработчик сообщений, который также вызывал ContinueWith, поэтому поток был вызван обработчиком сообщений, затем фактической службой, затем обработчиком сообщений. Самое классное в этом то, что я смог передать переменные из функции обработчика входных сообщений в функцию обработчика выходных сообщений. Это невозможно с OnActionExecuting и OnActionExecuted, поскольку вы не можете передавать переменные из Executing в Executed функции. - person Luke Belbina; 29.03.2012
comment
Похоже, ActionArguments может быть решением для этого. - person Luke Belbina; 29.03.2012
comment
@nextgenneo ActionArguments — это параметры, которые будут переданы в метод действия. Не используйте это. Вместо этого используйте HttpRequestMessage.Properties. - person marcind; 29.03.2012