2016-06-15 14 views
6

Ho un controller in esecuzione su ASP.NET Core 1.0 RC2 e mi piacerebbe scaricare i dati POST non elaborati in telemetria poiché ApplicationInsights non fa questo per voi. Il mio codice assomiglia a questoAcquisizione di dati POST non elaborati quando si utilizza [FromBody]

[HttpPost] 
[Produces("application/json")] 
public IActionResult Post([FromBody] RequestClass RequestData) 
{ 
    var stream = this.HttpContext.Request.Body; 
    stream.Position = 0; 
    using (var reader = new StreamReader(stream)) 
    { 
     string body = reader.ReadToEnd(); 
     Telemetry.TrackTrace(body, Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Information); 
    } 
    return Ok(); 
} 

Ma la stringa "corpo" viene sempre vuota. Se rimuovo la decorazione [FromBody] dalla firma della funzione, allora questo codice funziona, ma l'oggetto RequestData contiene solo null, che non è quello che voglio.

L'unica cosa che riesco a pensare è la conversione di RequestData su una stringa Json, ma questo sembra goffo e lento.

(EDIT: i dati POST è JSON)

+0

Sono in una situazione simile a quella che eravate. Puoi pubblicare quale è stata la tua correzione? – mituw16

+0

Come accennato nella risposta Tratcher di seguito, ho utilizzato EnableRewind 'app.Use ((contesto, next) => {context.Request.EnableRewind(); return next();});' –

+0

Vedo .. Potrebbe essere vale la pena di aggiungerlo alla tua domanda in quanto la sua risposta riguarda "BufferBody" e il bit di riavvolgimento Enable è solo nei commenti. Darò un colpo. Grazie! – mituw16

risposta

8

È necessario abilitare i buffer corpo della richiesta: services.Configure<FormOptions>(options => options.BufferBody = true); https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs#L20

+1

Grazie, funziona per i miei endpoint che usano i moduli, ma sfortunatamente non funziona per gli endpoint che portano Json come dati dei post. Esiste un equivalente per le richieste non formali? Ho guardato attraverso il Github a cui ti sei collegato e non riesco a vedere nulla. –

+1

Ho esaminato il codice per capire cosa stava facendo BufferBody, e sulla base di ciò ho provato ad aggiungere 'Microsoft.AspNetCore.Http.Internal.EnableRewind (this.HttpContext.Request);' Ma questo non sembra risolvere il problema. (Sì, so che non dovrei accedere ai namespace interni, ma volevo solo sapere se avrebbe funzionato) –

+2

EnableRewind potrebbe funzionare, ma dovresti chiamarlo prima di MVC. – Tratcher

3

Il modo più semplice che ho trovato per risolvere questo problema è quello di utilizzare jobject come il modello. E inviare la richiesta con Content-Type: application/json nell'intestazione.

usare qualcosa di simile dll JSON di NewtonSoft questo:

[HttpPost] 
public IActionResult Post([FromBody] jObject RequestData) 
{ 
    string str = RequestData["key"]; 
    return Ok(); 
} 

questo ha lavorato per me