2014-04-09 17 views
8

Ich möchte die neue Methode für globale Protokollierungsfehler verwenden. Ich habe eine Klasse geschrieben, die ExceptionLogger erbt und überschreibt die Log() Methode. Dann registriert es als Ersatz.Aktionsparameter von ExceptionLogger referenzieren

public class TraceExceptionLogger : ExceptionLogger 
{ 
    public async override void Log(ExceptionLoggerContext context) 
    { 
     // This is always empty string 
     var content = await context.Request.Content.ReadAsStringAsync(); 

     // This is almost always null 
     var actionContext = context.ExceptionContext.ActionContext; 
    } 
} 

Ich kann durch die ExceptionLoggerContext Eigenschaften des Objekts graben so ziemlich alles zu bekommen, ich brauche, außer den Aktionsparameter. Es ist in der Tat eine ActionContext Eigenschaft, aber ich habe es nur Null gesehen und this wiki page Staaten, dass ActionContext und ControllerContext wird fast immer Null sein.

Außerdem kann ich den Inhaltsstream nicht abrufen, da sein Stream bereits gelesen wird, bevor er zu meinem Logger gelangt. Es gibt also keine Möglichkeit für mich, irgendeinen geposteten JSON vom Inhalt der Anfrage zu bekommen.

Gibt es vielleicht eine Möglichkeit, die veröffentlichten Daten von HttpContext.Current oder auf andere Weise zu bekommen?

Antwort

7

Ok es sieht aus wie ich den Körper Text aus Httpcontext von Inputstream auf dem Request-Objekt wie folgt zu lesen bekommen:

string bodyText = string.Empty; 

using (var sr = new StreamReader(HttpContext.Current.Request.InputStream)) 
{ 
    sr.BaseStream.Seek(0, SeekOrigin.Begin); 
    bodyText = sr.ReadToEnd(); 
} 

meine geposteten json Daten Dieser Code wurde erfolgreich ich bisher für immer.

+1

SIE MEINE ASS GERETTET! Ich wollte mich umbringen. Es war super frustrierend, den Inhalt der Anfrage nicht zu protokollieren. –

+0

@StefanVasiljevic Ich bin so froh, dass es geholfen hat und dass ich dein Leben gerettet habe. Ich denke, das ist das erste Mal, dass mein Code das jemals gemacht hat, haha. Prost! – jlafay

+1

@jlafay ..und es wird nicht der letzte sein! Nov 2017, immer noch Leben retten! – CloudyOne

4

Hier Aktionsparameter für zukünftige Referenz

public class HomeController : ApiController { 
    public string Get(string id, [FromHeader] Whoever whoever) { 

    public string Post(Whatever whatever) { 


var args = ((ApiController) context.ExceptionContext 
      .ControllerContext.Controller)).ActionContext.ActionArguments 

if (args.ContainsKey("whatever")) { 
    var whatever = (Whatever)args["whatever"]; 
Verwandte Themen