2016-06-15 4 views
6

У меня есть контроллер, работающий на ASP.NET Core 1.0 RC2, и я бы хотел сбросить необработанные данные POST в телеметрию, поскольку ApplicationInsights не делает этого для вас. Мой код выглядит так:Получение данных POST при использовании [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(); 
} 

Но строка «тело» всегда появляется пустой. Если я удалю декор [FromBody] из сигнатуры функции, тогда этот код работает, но объект RequestData содержит только нуль, чего я не хочу.

Единственное, о чем я могу думать, это преобразовать RequestData обратно в строку Json, но это кажется неуклюжим и медленным.

(EDIT: данные POST является Json)

+0

Я в такой же ситуации, как и вы. Можете ли вы опубликовать свое исправление? – mituw16

+0

Как упоминалось в Tratchers ниже, я использовал EnableRewind 'app.Use ((context, next) => {context.Request.EnableRewind(); return next();});' –

+0

Я вижу .. Может быть стоит добавить, что на ваш вопрос, так как его ответ о «BufferBody», а бит «Включить перемотку» - только в комментариях. Я сделаю это. Благодаря! – mituw16

ответ

8

Вам необходимо включить буферизацию тело запроса: services.Configure<FormOptions>(options => options.BufferBody = true); https://github.com/aspnet/HttpAbstractions/blob/dev/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs#L20

+1

Спасибо, что работает для моих конечных точек, которые используют формы, но, к сожалению, не работает для конечных точек, которые воспринимают Json как данные post. Существует ли эквивалент для запросов без формы? Я просмотрел связанный с ним github и ничего не вижу. –

+1

Я просмотрел код, чтобы определить, что делает BufferBody, и на основе этого я попытался добавить 'Microsoft.AspNetCore.Http.Internal.EnableRewind (this.HttpContext.Request);' Но это, похоже, не исправляет проблема. (Да, я знаю, что я не должен обращаться к внутренним пространствам имен, но просто хотел знать, будет ли это работать) –

+2

EnableRewind может работать, но вам нужно будет вызвать его перед MVC. – Tratcher

3

Самый простой способ я нашел, чтобы решить эту проблему заключается в использовании jObject как Модель. И отправьте запрос с Content-Type: application/json в заголовке.

использовать что-то вроде библиотеки DLL JSon NewtonSoft в этом:

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

Это работало для меня

Смежные вопросы