2015-10-29 5 views
3

Я ищу способ перехватить/захватить запрос, сделанный до сопоставления с маршрутом. Например, у меня установлено несколько контроллеров и маршрутов, но я хочу, чтобы какой-то механизм был поражен до того, как будет применен метод маршрута. Было бы очень предпочтительным, если бы этот механизм смог получить параметры маршрута, которые были отправлены.Перехватить все вызовы WebApi до того, как произойдет сопоставление маршрутов

Мне не удалось найти что-то похожее на то, что я ищу (но, возможно, не очень хорошо разбираюсь в веб-API, я искал неправильные ключевые слова).

+0

Вы можете посмотреть в Application_BeginRequest в global.asax. –

ответ

5

Что вам нужно - это фильтры действий. Вы можете применять фильтры действий непосредственно к контроллерам в качестве атрибутов, оговорка с фильтрами действий заключается в том, что в этот момент маршрут контроллера уже известен, но вы все равно можете управлять (очень похожим на AOP), если метод действия может быть выполнен или нет:

ASP.NET Web API ActionFilter example

Посмотрите, как вы можете использовать фильтр действий, в этом случае для регистрации:

public class LogActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     Log(actionExecutedContext.ActionContext.RequestContext.RouteData); 

     base.OnActionExecuted(actionExecutedContext); 
    } 

    private void Log(System.Web.Http.Routing.IHttpRouteData httpRouteData) 
    { 
     var controllerName = "controller name"; 
     var actionName = "action name"; 
     var message = String.Format("controller:{0}, action:{1}", controllerName, actionName); 

    Debug.WriteLine(message, "Action Filter Log"); 
    } 
} 

How to log which action method is executed in a controller in webapi

вы также можете использовать обработчик сообщений, которые ар е выполняется до контроллера будет решен:

HTTP Message Handlers in ASP.NET Web API

+2

'Я ищу способ перехватить/захватить запрос, сделанный до сопоставления с маршрутом. - Фильтры действий появляются после согласования маршрута, нет? Возможно также, что вопрос просто недостаточно ясен, чтобы обеспечить правильный ответ. – Tung

+0

Если это то, что вы хотите, вы можете использовать обработчик сообщений, что вам нужно сделать до того, как маршрут будет обнаружен? – Marco

+0

Я просто цитирую часть вопроса из ОП, потому что я думаю, что ваш ответ, возможно, пропустил этот аспект :) – Tung

0

Будет ли он работать над созданием HttpHandler (или сделать это только в событии Global asax Application_BeginRequest) для захвата запросов и внутри обработчика проанализировать URL-адрес с настройкой маршрута, аналогично this link.

+0

У вас есть лучшие способы достижения этого с помощью того, что предоставляет веб-API. – Marco

3

Я использую упомянутую технику, чтобы регистрировать все запросы и ответы. Говоря вкратце, лучший способ сделать это - использовать Handlers.

Во-первых, создать обработчик:

public class CustomHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     //get route values and process them 
     var routeValues = (IHttpRouteData[]) HttpContext.Current.Request.RequestContext.RouteData.Values["MS_SubRoutes"]; 

     //let other handlers process the request 
     return await base.SendAsync(request, cancellationToken) 
      .ContinueWith(task => 
      { 
       //once response is ready, do something with it           

       return task.Result; 
      }, cancellationToken); 
    } 
} 

Затем, зарегистрировать его в WebApiConfig:

config.MessageHandlers.Add(new CustomHandler()); 
+0

Если вы используете обработчики делегатов для регистрации всех запросов, вы также будете регистрировать неверные запросы, если все, что вам нужно, - это вести журнал, вы должны использовать фильтры действий, а не обработчики. – Marco

+0

@Marco те меня тоже заинтересовали :) – balbelias

+0

Оба они позволяют вам регистрировать ваши запросы, но с фильтрами действий вам легче регистрировать только содержательные данные :) – Marco