Rücklaufanforderung Body Stream

Ich implementiere einen Anforderungslogger als Owin Middleware neu, der die Anforderungs-URL und den Text aller eingehenden Anforderungen protokolliert.Ich kann den Body lesen, aber wenn ich das tue, ist der Body-Parameter in meinem Controller null.

Ich vermute, es ist null, weil die Stream-Position am Ende ist, sodass nichts mehr zu lesen ist, wenn versucht wird, den Körper zu deserialisieren. Ich hatte ein ähnliches Problem in einer früheren Version der Web-API, konnte aber die Stream-Position auf 0 zurücksetzenThis stream does not support seek operations Ausnahme.

In der neuesten Version von Web API 2.0 konnte ich anrufenRequest.HttpContent.ReadAsStringAsync()in meinem Anforderungslogger, und der Körper würde immer noch in Takt an der Steuerung ankommen.

Wie kann ich den Stream nach dem Lesen zurückspulen?

oder

Wie kann ich den Anfragetext lesen, ohne ihn zu verbrauchen?

public class RequestLoggerMiddleware : OwinMiddleware
{
    public RequestLoggerMiddleware(OwinMiddleware next)
        : base(next)
    {
    }

    public override Task Invoke(IOwinContext context)
    {
        return Task.Run(() => {
            string body = new StreamReader(context.Request.Body).ReadToEnd();
            // log body

            context.Request.Body.Position = 0; // cannot set stream position back to 0
            Console.WriteLine(context.Request.Body.CanSeek); // prints false
            this.Next.Invoke(context);
        });
    }
}
public class SampleController : ApiController 
{
    public void Post(ModelClass body)
    {
        // body is now null if the middleware reads it
    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage