首页 > 解决方案 > 遥测初始化程序从 .net 核心 MVC 应用程序添加请求正文内容以请求遥测属性不起作用

问题描述

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

问题:

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

有没有一种方法可以在执行 MVC 操作之前调用初始化程序。我尝试使用 IWebHostBuilder 和 IServiceCollection 配置应用程序洞察力。

有人遇到过这个问题吗?

版本信息 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
   }
}

标签: c#asp.net-coreazure-application-insights

解决方案


我也在 Github 上回复了你的帖子。这是使用来自 Http Post/Put 请求正文的信息丰富遥测的正确方法。这是一个控制器 Post Action,RequestTelemetry 包含来自 post body 的信息。

[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);
        }

推荐阅读