如何在应用见解遥测初始值设定项中访问 OWIN 请求?



我正在尝试访问自定义 AppInsights 遥测初始值设定项中的 HTTP 请求。

主要是,我想提取POST体。

我的问题与另一个答案有关

但是,答案表明使用HttpContext.Current.Request.InputStream.

我不能这样做...就像我在 OWIN 环境中一样。

有什么想法吗?

谢谢

OWIN 引入了中间件的概念(稍后由 asp.net 核心扩展(,要求您分层构建应用程序。
它提高可维护性,性能以及保持高度的关注点分离的主要原因之一。
在这个过程中,他们删除了大多数静态上下文变量(如httpContext.Current(,等效的信息将由OWIN基础设施作为OwinContext传递给你的中间件。
话虽如此,如果您使用的是应用程序见解,则不必从头开始编写中间件,存在一个出色的 nuget 包来帮助您更快地到达那里。 最后,由于它的实现方式,请求的正文只能使用一次(至少是安全的(,请参阅相关的 github 问题

我只想扩展Baywet的答案。

如果可以,我建议使用现有的 nuget 包通过 OWIN 扩展应用程序见解。在这种情况下,您至少需要 .NET Framework 4.6.1。

否则,您可以使用"我的"解决方案。我刚刚混合了两个答案:

  • 如何实现用于应用程序见解的 OWIN 中间件
  • 如何在 OWIN 中间件中记录响应正文

我需要的是记录异常和请求。这就是我所做的..(在这里,我写了一些基本的东西,让你写一个有效的解决方案(。

我创建了两个不同的对象跟踪器:TrackerExceptionTrackerRequest。两者都实现了代理模式。这样,我就不必显然关心我决定跟踪的内容。我只是让你看到一个跟踪器的更简单的实现:

public class TrackerException : ITracker
{
private readonly TelemetryClient _telemetryClient;
public TrackerException(TelemetryClient telemetryClient)
{
this._telemetryClient = telemetryClient;
}
public void Track(ITelemetryObject telemetry)
{
if (telemetry is TelemetryExceptionObject)
{
Exception ex = ((TelemetryExceptionObject)telemetry).Exception;
this._telemetryClient.TrackException(ex);
}
}
}

我在自定义 Owin 中间件中使用跟踪器:

public class ApplicationInsightsMiddleware : OwinMiddleware
{
private TrackingOptions _trackingOptions;
public ApplicationInsightsMiddleware(OwinMiddleware next) 
: base(next)
{ }
public ApplicationInsightsMiddleware(OwinMiddleware next, TrackingOptions trackingOptions) 
: base(next)
{
this._trackingOptions = trackingOptions;
}
public override async Task Invoke(IOwinContext context)
{
var client = new TelemetryClient();
this._trackingOptions.TelemetryClient = client;
// Start Time Tracking
var sw = new Stopwatch();
var startTime = DateTimeOffset.Now;
sw.Start();
this._trackingOptions.TrackRequest.ReadRequestBody(context.Request);
try
{
await Next.Invoke(context); 
}
catch (Exception ex)
{
ITelemetryObject exception = new TelemetryExceptionObject(ex);
this._trackingOptions.TrackException.Track(exception);
throw ex;
}
RequestTelemetry requestTelemetry = this._trackingOptions.TrackRequest.CreateTelemetryRequest(context.Request, context.Response, startTime, sw.Elapsed);
ITelemetryObject request = new TelemetryRequestObject(requestTelemetry);
this._trackingOptions.TrackRequest.Track(request);
sw.Stop();
}
}

TrackingOptions是一个启用或不启用跟踪器的类......这是它的实现:

public class TrackingOptions
{
//Here I initialize all my trackers
private ProxyTrackerException _trackException;
internal ProxyTrackerException TrackException { get { return _trackException; } }
private TelemetryClient _telemetryClient;
internal TelemetryClient TelemetryClient
{
get { return _telemetryClient; }
set { _telemetryClient = value; }
}
public TrackingOptions(bool enableTrackingRequest, bool enableTrackingException)
{
this.InitializeExceptionTracker(enableTrackingException);
//...
}
private void InitializeExceptionTracker(bool enableTrackingException)
{
this._trackException = new ProxyTrackerException(enableTrackingException, this._telemetryClient);
}
}

最后我为 Owin 编写了一个扩展方法

public static void UseApplicationInsights(this IAppBuilder app, TrackingOptions options)
{
app.Use(typeof(ApplicationInsightsMiddleware), options);
}

在我的项目启动时,我添加了我的新中间件:

app.UseApplicationInsights(
new TrackingOptions(enableTrackingRequest: true, enableTrackingException: true)
);

但是,这对我来说是一个临时解决方案...我将尽快更新我的框架并安装现有的 nuget 包。

最新更新