遥测初始化程序,用于从.net核心MVC应用程序添加请求正文内容,以请求遥测属性不起作用

时间:2018-05-10 20:19:31

标签: c# asp.net-core azure-application-insights

我正在尝试将应用程序洞察力集成到.net核心MVC应用程序中。一切都按预期工作,直到我添加遥测初始化程序来读取请求正文内容。我创建了一个ITelemetryInitializer,如果遥测类型是请求遥测,它会从请求体读取内容。但是我得到了#34; System.ObjectDisposedException:'无法访问已处置的对象。'"

问题:

在调试时我注意到,当进行POST / PUT http调用时,在Initialize()方法之前调用MVC操作方法。因此,在调用Initialize()方法时,已经处理了请求正文请求流。我已经为4.6框架web api应用程序提供了类似的实现,但是没有这个问题它可以正常工作。

有没有办法可以在执行MVC操作之前调用初始值设定项。我尝试使用IWebHostBuilder和IServiceCollection配置应用程序洞察。

有没有人遇到过这个问题?

版本信息 SDK版本:2.2.1 .NET版本:.Net core 2.0 如何使用SDK(VisualStudio / StatusMonitor / Azure扩展)加载应用程序: OS: 托管信息(IIS / Azure WebApps / etc):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 :(得分:1)

我也回复了你在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);
        }