2016-08-09 73 views
0

Ich habe eine Klasse logging.cs, die in meinem WebApi-Projekt verwendet wird, um Informationen über die eingehende Anfrage zu protokollieren.Wie erhält man den Namen des Controllers in WebApi Request?

Die Klasse wird von meiner Application_BeginRequest() -Methode in meinem Global.asax ausgelöst. Ich brauche den Controller-Namen und die Autorisierung Header in der Anfrage. Wie macht man ?

Ich spiele weiter mit dem HttpRequest Request-Objekt, aber ich kann nicht scheinen, was ich genau brauche. (Obwohl Methode der HTTP-Anfrage scheint einfach genug!)

Für die Autorisierung Header würde ich denke, es wäre so einfach wie "Request.Headers [" Authorization "];" Dies kommt jedoch als Null zurück.

Mein Code ist unten, jede Richtung oder Beratung würde sehr geschätzt werden. -Jason

namespace WCAPI.BLL 
{ 
    public class logging_2 
    { 
     private static HttpRequest Request 
     { 
      get { return HttpContext.Current.Request; } 
     } 

     private static HttpResponse Response 
     { 
      get { return HttpContext.Current.Response; } 
     } 

     public static void LogWcapiRequest(BLL.DebugTmr tmr) 
     { 
      if (tmr.EventType == DebugTmr.EventTypes.Null) { return; } 

      try 
      { 
       Services.AFSILog log = new Services.AFSILog(); 
       log.Level = Services.LogLevels.Info; 
       log.SourceSystem = ANACore.AMTConfig.GetConfigurationValue("ConsoleLogSourceSystem"); 
       if (Request.Url.IsLoopback) { log.SourceSystem += "_" + System.Environment.MachineName; } 
       log.Stamp = DateTime.Now; 
       log.Message = tmr.FormatedMsg; 
       log.Category = tmr.EventType.ToString(); 


       List<Services.LogData> dets = new List<Services.LogData>(); 
       dets.Add(new Services.LogData { DataType = Services.ParameterDataTypes.Int, DataKey = "Duration", DataValue = tmr.ElapsedMs.ToString() }); 

       //This appears to be easy!! 
       var meth = Request.HttpMethod; 
       dets.Add(new Services.LogData { DataType = Services.ParameterDataTypes.Int, DataKey = "Method", DataValue = meth }); 

       //Now how do I get Authorization Header and Controller name ? 


       foreach (BLL.DebugTmr.Waypoint wp in tmr.Waypoints) 
       { 
        dets.Add(new Services.LogData 
        { 
         DataType = Services.ParameterDataTypes.Int, 
         DataKey = wp.Name + "Ms", 
         DataValue = wp.ElapsedMs.ToString() 
        }); 
       } 

       log.Parameters = dets.ToArray(); 
       // This is what actually writes to the log I just need add Authorization header and Controller name to my log object 
       SaveLog(log); 
      } 
      catch (Exception ex) 
      { 
       Debug.Print("Page log create failed : {0}", ex.Message); 
      } 
     } 
    } 
} 
+0

Wenn Sie 'HttpContext' verwenden können, sollten Sie sich diese Frage ansehen http://stackoverflow.com/questions/5302444/can-i-get-the-controller-from-the-httpcontext – smoksnes

Antwort

1

Sie sollten einen Aktionsfilter für logging.That Art und Weise implementieren Sie in der Lage sein wird, den Namen der Steuerung durch den HttpActionContext Parameter

Api-Controller zuzugreifen:

public class LeadsController : ApiController 
{ 
    [Logger] 
    public List<string> Get() 
    { 
     return new List<string> { "Lead 1", "Lead 2", "Lead 3", "Lead 4","Lead 5" }; 
    } 
} 

Filter:

public class Logger : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     string controllerName = 
      actionContext.ControllerContext.ControllerDescriptor.ControllerName; 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
    } 
} 

Sie können jede Methode, die protokolliert werden muss, mit [Logger] dekorieren oder auf der Controller-Ebene jeden einzelnen Anruf innerhalb des Controllers protokollieren. Schließlich können Sie Ihren Aktionsfilter global so konfigurieren, dass er bei jeder Aktion ausgeführt wird in Ihrem Projekt aufgerufen.

+0

Vielen Dank ! Ich habe es wo ich den Controller Namen jetzt bekommen kann. Ich versuche immer noch, meine Protokollierungsklasse als globalen Filter zu registrieren. –

+0

Bitte denken Sie daran, als beantwortet zu markieren, wenn es Ihnen geholfen hat –