2016-02-22 3 views
3

Как я могу получить имя контроллера api и имя действия api внутри части пользовательского промежуточного ПО OWIN? Я могу сделать это внутри обработчика сообщений так:Web Api 2 получить контроллер и название действия в промежуточном ПО OWIN?

var config = request.GetConfiguration(); 
var routeData = config.Routes.GetRouteData(request); 
var controllerContext = new HttpControllerContext(config, routeData, request); 
request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; 
controllerContext.RouteData = routeData; 
var controllerDescriptor = new 
DefaultHttpControllerSelector(config).SelectController(request); 
controllerContext.ControllerDescriptor = controllerDescriptor; 
var actionMapping = new ApiControllerActionSelector().SelectAction(controllerContext); 

//controller name 
controllerDescriptor.ControllerName 
//action name 
actionMapping.ActionName 

Update: Вот мой текущий кусок Owin ППО. Как я могу получить имя controllerName и actionName в этом коде?

using AppFunc = Func<IDictionary<string, object>, Task>; 

public class LoggingMiddleware 
{ 
    private readonly AppFunc _next; 
    private static readonly ILog RequestApiLogger = LogManager.GetLogger("RequestApiPacketLogger"); 
    private static readonly ILog ResponseApiLogger = LogManager.GetLogger("ResponseApiPacketLogger"); 

    public LoggingMiddleware(AppFunc next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(IDictionary<string, object> environment) 
    { 
     var correlationId = Guid.NewGuid(); 
     IOwinContext context = new OwinContext(environment); 

     // Buffer the request (body is a string, we can use this to log the request later 
     var requestBody = new StreamReader(context.Request.Body).ReadToEnd(); 
     var requestData = Encoding.UTF8.GetBytes(requestBody); 
     context.Request.Body = new MemoryStream(requestData); 

     // Buffer the response 
     var responseBuffer = new MemoryStream(); 
     var responseStream = context.Response.Body; 
     context.Response.Body = responseBuffer; 

     // add the "http-tracking-id" response header so the user can correlate back to this entry 
     var responseHeaders = (IDictionary<string, string[]>)environment["owin.ResponseHeaders"]; 
     responseHeaders["http-tracking-id"] = new[] { correlationId.ToString("d") }; 

     IDictionary<string, string[]> responseHeadersClone = new Dictionary<string, string[]>(responseHeaders); 

     //invoke the next piece of middleware in the pipeline 
     await _next.Invoke(environment); 

     // rewind the request and response buffers and record their content 
     responseBuffer.Seek(0, SeekOrigin.Begin); 
     var reader = new StreamReader(responseBuffer); 
     var responseBody = await reader.ReadToEndAsync(); 

     // log the request/response as long at it wasn't preflight 
     if (context.Request.Method.ToUpper() != "OPTIONS") 
     { 
      RequestApiLogger.LogHttpRequestAsync(context, correlationId, requestBody); 
      ResponseApiLogger.LogHttpResponseAsync(context, correlationId, responseBody, responseHeadersClone); 
     } 

     // You need to do this so that the response we buffered is flushed out to the client application. 
     responseBuffer.Seek(0, SeekOrigin.Begin); 
     await responseBuffer.CopyToAsync(responseStream); 
    } 
} 

ответ

2

Вы действительно не можете. Прошивка OWIN не знает о Web Api. Он знает только об окружающей среде, которая передается ему. Идея промежуточного ПО заключается в том, что он не зависит от платформ хостинга и приложений.

Вы не указали конкретный пример того, что вы пытаетесь выполнить, поэтому может быть способ сделать то, что вы пытаетесь сделать.

Update, чтобы включить ответ выше заявление:

Вы можете полностью изменить то, что вы пытаетесь сделать. Вроде. OWIN-среда доступна в HttpRequest внутри Web Api с помощью метода GetOwinEnvironmentExtension. Вы можете добавить переменную окружения в словарь с именем контроллера и методом внутри контроллера, а затем использовать это, когда вы вызываете свое промежуточное программное обеспечение после завершения веб-api. Много повторяющегося кода, но это сработает.

Возможно, есть способ перехватить метод до его вызова. Проверьте this ответ от @ mark-jones, который может дать вам некоторое представление об этом.

Надеюсь, что это поможет.

+0

Я обновил свой вопрос, чтобы показать свою текущую часть промежуточного программного обеспечения. Я пытаюсь получить ControllerName и ActionName, поэтому я могу включить эти поля в мою таблицу протоколирования для лучшей отслеживаемости. – BBauer42

 Смежные вопросы

  • Нет связанных вопросов^_^