ASP.NET Web-API-Protokollierung für Eingehende Anfrage Inhalt

Ich versuche zu Protokoll, Web-API-Request-Inhalte – also die json-string. Ich habe implementiert eine ITraceWriter Klasse (Beispiel) und konfiguriert es so, dass die Web-API-Aufrufe in die pipeline. Aber wenn ich Lesen die Anfrage.Inhalte oder kopieren in einem stream zu Lesen, es ist nicht für die Methode, was in einer null-Modell. Dieser Beitrag Gespräche über dieses Thema ein wenig. Jemand Erfahrung ausloggen eingehende Web-API-Anforderung von Inhalten und wissen, was der beste Ansatz ist?

Dank

Update Ein

Habe ich eine einfache Beispiel-Web-API-Projekt, um auszuschließen, etwas in meinem Projekt, und ich sehe immer noch, dass das Modell wird null sein, da der Protokollierung. Ich habe einfach test ein paar mal hintereinander durch die Veröffentlichung über Fidder und sehen, mein Modell kommt in null. Mit Haltepunkten im Ort, es könnte funktionieren, das ist, warum ich denke, es ist ein sync/timing-Problem. Irgendwelche Gedanken auf, wie diese zu arbeiten?

Header:

User-Agent: Fiddler
Host: localhost:56824
Content-Type: application/json
Content-Length: 22

Körper:

{
"A":1,"B":"test"
}

Hier der code:

Controller:

public class ValuesController : ApiController
{
    [HttpPost]
    public void Post(ValuesModel model)
    {
        if (model == null)
        {
            Debug.WriteLine("model was null!");
        }
        else
        {
            Debug.WriteLine("model was NOT null!");
        }
    }
}

Modell:

public class ValuesModel
{
    public int A { get; set; }
    public string B { get; set; }
}

Logger:

public class APITraceLogger : DelegatingHandler
    {
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            if (request.Content != null)
            {
                //This can cause model to be null
                request.Content.ReadAsStringAsync().ContinueWith(s =>
                {
                    string requestText = s.Result;
                    Debug.WriteLine(requestText);
                });

                //and so can this
                //request.Content.ReadAsByteArrayAsync()
                //   .ContinueWith((task) =>
                //   {
                //       string requestText = System.Text.UTF8Encoding.UTF8.GetString(task.Result);
                //       Debug.WriteLine(requestText);
                //   });
            }
            //Execute the request, this does not block
            var response = base.SendAsync(request, cancellationToken);

            //TODO:
            //Once the response is processed asynchronously, log the response data
            //to the database


            return response;
        }


    }

Kabel, logger in der Klasse WebApiConfig:

config.MessageHandlers.Add(new APITraceLogger());

Update B

Scheint es, wie es jetzt ist, funktioniert, wenn ich den logger um den folgenden code hinzufügen, die erwarten, async und gibt das Ergebnis zurück. Scheint wie etwas, was ich nicht bin Verständnis in der asynchronen code oder wirklich ein timing-Problem oder so etwas.

public class APITraceLogger : DelegatingHandler
{
    protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        if (request.Content != null)
        {

            //This does seem to work - is it because it is synchronous?  Is this a potential problem?
            var requestText = await request.Content.ReadAsStringAsync();
            Debug.WriteLine(requestText);
        }
        //Execute the request, this does not block
        var response = base.SendAsync(request, cancellationToken);

        //TODO:
        //Once the response is processed asynchronously, log the response data
        //to the database


        return response.Result;
    }


}
InformationsquelleAutor Bryan | 2013-03-19
Schreibe einen Kommentar