Инициализатор телеметрии для добавления содержимого тела запроса из приложения MVC .net core для запроса свойств телеметрии не работает. - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь интегрировать информацию о приложении в приложение .net core MVC.Все работало как ожидалось, пока я не добавил инициализатор телеметрии для чтения содержимого тела запроса.Я создал ITelemetryInitializer, который считывает содержимое из тела запроса, если тип телеметрии - это телеметрия запроса.Но я получаю «System.ObjectDisposedException:« Не удается получить доступ к удаленному объекту. »»

Проблема:

При отладке я заметил, что когда выполняется HTTP-вызов POST / PUT, действие MVCМетод вызывается перед методом Initialize ().Таким образом, к тому моменту, когда вызывается метод Initialize (), поток запроса тела запроса уже удаляется.У меня есть аналогичная реализация для приложения 4.6 API веб-фреймворка, но она прекрасно работает без этой проблемы.

Есть ли способ вызвать инициализаторы до выполнения действия MVC.Я попытался настроить понимание приложения с помощью IWebHostBuilder и IServiceCollection.

Кто-нибудь сталкивался с этой проблемой?

Версия Info SDK Версия: 2.2.1 .NET Версия: .Net core 2.0 Как приложение было загружено сSDK (VisualStudio / StatusMonitor / расширение Azure): ОС: информация о хостинге (IIS / Azure WebApps / и т. Д.): IIS

Обновление (скопированный код из комментария) :

if (!(telemetry is RequestTelemetry requestTelemetry))
   return;
var request = _httpContextAccessor.HttpContext?.Request;
if (request == null)
   return;
if (request.Body.CanRead)
{
   request.EnableRewind();
   using (var memoryStream = new MemoryStream())
   { 
      request.Body.CopyTo(memoryStream);
      request.Body.Position = 0; //add to telemetry properties
   }
}

1 Ответ

0 голосов
/ 11 мая 2018

Я ответил и на ваш пост в Github. Вот правильный способ обогатить телеметрию информацией из тела запроса Http Post / Put. Это контроллер Post Action, а RequestTelemetry обогащен информацией из тела сообщения.

[HttpPost]
        public IActionResult Create([FromBody] TodoItem item)
        {
            if (item == null)
            {
                return BadRequest();
            }

            RequestTelemetry requestTelemetry = HttpContext.Features.Get<RequestTelemetry>();
            requestTelemetry.Properties.Add("nameFromBody", item.Name);

            _context.TodoItems.Add(item);
            _context.SaveChanges();

            return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
        }
...