Wenn Sie application/x-www-form-urlencoded
oder multipart/form-data
verwenden, können Sie sicher nennen context.Request.ReadFormAsync()
mehrere Male, da es eine zwischengespeicherte Instanz bei nachfolgenden Aufrufen zurückgibt.
Wenn Sie einen anderen Inhaltstyp verwenden, müssen Sie die Anforderung manuell puffern und den Anfragetext durch einen zurückspulbaren Stream wie MemoryStream
ersetzen. Hier ist, wie Sie tun können, eine Inline-Middleware (Sie müssen es bald in Ihrer Pipeline registrieren):
app.Use(next => async context => {
// Keep the original stream in a separate
// variable to restore it later if necessary.
var stream = context.Request.Body;
// Optimization: don't buffer the request if
// there was no stream or if it is rewindable.
if (stream == Stream.Null || stream.CanSeek) {
await next(context);
return;
}
try {
using (var buffer = new MemoryStream()) {
// Copy the request stream to the memory stream.
await stream.CopyToAsync(buffer);
// Rewind the memory stream.
buffer.Position = 0L;
// Replace the request stream by the memory stream.
context.Request.Body = buffer;
// Invoke the rest of the pipeline.
await next(context);
}
}
finally {
// Restore the original stream.
context.Request.Body = stream;
}
});
Sie können auch die BufferingHelper.EnableRewind()
Erweiterung verwenden, die einen Teil des Microsoft.AspNet.Http
Paket ist: es basiert auf einem ähnlichen Ansatz sondern stützt sich auf einen speziellen Strom, der Pufferung von Daten im Speicher beginnt und Spulen alles in eine temporäre Datei auf der Festplatte, wenn der Schwellenwert erreicht ist:
app.Use(next => context => {
context.Request.EnableRewind();
return next(context);
});
FYI: eine Puffermiddleware wird wahrscheinlich zu vNext in der Zukunft hinzugefügt werden.
Nur neugierig, warum liest du den Körper des Antrags, wenn die Authentifizierung durchführen? –
Es ist eine API, wo die Anfrage zum Beispiel ApiKey auch beim Aufbau der Antwort und auch ein Hash benötigt wird, um die Anfrage zu sichern. Was macht keinen Sinn in den Kopfzeilen zu sein. –
Ein [Beispiel] (http://stackoverflow.com/questions/42561350/read-json-post-data-in-asp-net-core-mvc/42922579#42922579) von PinPoint EnableRewind verwenden, um Json von Körper zu lesen. –