我正在尝试将应用程序洞察力集成到.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
}
}
答案 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);
}