Se stai usando application/x-www-form-urlencoded
o multipart/form-data
, si può tranquillamente chiamare context.Request.ReadFormAsync()
più volte in quanto restituisce un'istanza memorizzata nella cache per le chiamate successive.
Se si utilizza un tipo di contenuto diverso, è necessario memorizzare manualmente la richiesta e sostituire il corpo della richiesta con uno stream riavvolgibile come MemoryStream
. Ecco come si potrebbe fare con un middleware in linea (è necessario registrarsi al più presto nella vostra pipeline):
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;
}
});
È anche possibile utilizzare la BufferingHelper.EnableRewind()
estensione, che è parte del pacchetto Microsoft.AspNet.Http
: si basa su un approccio simile ma si basa su un flusso speciale che inizia buffer di dati in memoria e bobine di tutto per un file temporaneo sul disco quando viene raggiunta la soglia:
app.Use(next => context => {
context.Request.EnableRewind();
return next(context);
});
FYI: un middleware buffer sarà probabilmente aggiunto alla vNext in futuro.
Solo per curiosità: perché stai leggendo il corpo della richiesta quando si esegue l'autenticazione? –
È un'API in cui è richiesta anche la richiesta ad esempio ApiKey quando si genera la risposta e anche un hash per proteggere la richiesta. Che non ha senso essere nelle intestazioni. –
Un [esempio] (http://stackoverflow.com/questions/42561350/read-json-post-data-in-asp-net-core-mvc/42922579#42922579) di utilizzo di EnableRewind di PinPoint per leggere json dal corpo. –