2016-06-03 1 views
1

Ich versuche, eine zusätzliche Protokollierung in mein WebAPI-System einzubauen. Mit den Lebenszyklusinformationen für IIS-Anforderungen konnte ich Code mithilfe von Application_BeginRequest und Application_EndRequest in Global.asax.cs protokollieren.Übergeben von Informationen zwischen WebApiApplication und ApiController

Es gibt jedoch Aktionen innerhalb einer Anfrage (zB: Datenbankaktivität), die innerhalb meiner ApiControllers passieren, die ich auch protokollieren möchte.

In der BeginRequest kann ich auf die HttpContext.Items zugreifen, um Informationen zu speichern, die in EndRequest abgerufen werden sollen. Dies scheint jedoch in einem ApiController nicht verfügbar zu sein.

Ich habe versucht, das Request.Headers-Objekt dazu zu verwenden. Aber ich denke, da einer eine HttpRequest und der andere HttpRequestMessage ist, teilen sie keinen gemeinsamen Speicherort.

Ich dachte, ein Sammelobjekt in Global statisch zu machen, und Informationen auf diese Weise zu speichern. Aber da es statisch ist, würde eine gegenseitige Befruchtung zwischen Anfragen nicht möglich sein?

** EDIT: versuchte dies und bestätigte, werden statische Daten zwischen den Anfragen geteilt

Es ist möglich, einen externen Datenspeicher zu verwenden, um dies zu tun, aber scheint, wie diese in der Lage sein sollten Recht innerhalb von IIS ausgeführt werden. Jede Richtung würde geschätzt werden.

Antwort

1

Nicht sicher, warum ich nicht früher darüber nachgedacht habe, aber ich habe gerade einen Eintrag zu den Request-Headern hinzugefügt, da dieser überall verfügbar ist.

Also in meinem Global.asax.cs:

protected void Application_BeginRequest(object sender, EventArgs e) 
    {    
     // this is avaiable in Global.asax - not ApiControllers 
     Context.Items.Add("request_start_time", DateTime.Now); 
     // this is avaiable everywhere 
     Request.Headers.Add("Request_Key", Guid.NewGuid().ToString()); 
    }