c# - 遥测初始化程序从 .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
}
}
解决方案
我也在 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);
}
推荐阅读
- c++ - 私有变量的 Qt 信号槽处理:特性还是缺陷?
- c# - 将 Google Sheets API 与服务帐户一起使用时出现 C# 错误
- wordpress - 如何在 WooCommerce 中抑制“商品已在购物车中”错误通知?
- rabbitmq - 如何从 wso2 得到 rabbitmq 的答案?
- javascript - 如何在nodejs中使用puppeteer将网页内容保存为mp4
- powershell - 在日历上设置文件夹权限,除非该用户已存在权限
- video-streaming - 局域网上最低的视频流延迟?
- android - 如何通过数据绑定传递密封类
- javascript - 使用 Nodejs 读取存储在 aws S3 中的 JSON 文件
- python - Django自定义用户模型,无法登录到django管理面板