我試圖訪問我的自定義AppInsights遙測初始值設定項中的HTTP請求。如何訪問AppInsights遙測初始值設定項中的OWIN請求?
主要是,我想提取POST
正文。
我的問題涉及到this other answer
但是,得到的答覆表明使用HttpContext.Current.Request.InputStream
。
我不能這樣做......因爲我在OWIN環境中。
任何想法?
感謝
我試圖訪問我的自定義AppInsights遙測初始值設定項中的HTTP請求。如何訪問AppInsights遙測初始值設定項中的OWIN請求?
主要是,我想提取POST
正文。
我的問題涉及到this other answer
但是,得到的答覆表明使用HttpContext.Current.Request.InputStream
。
我不能這樣做......因爲我在OWIN環境中。
任何想法?
感謝
OWIN引入中間件的,需要你建立層應用程序的概念(已被延長asp.net核心版本)。
其中一個主要原因是它可以提高可維護性,性能以及高度分散關注點。
在這個過程中,他們刪除了大部分靜態上下文變量(如httpContext.Current),OWIN基礎設施將等價信息作爲OwinContext傳遞給中間件。
這就是說,如果您正在使用Application Insights,則無需從頭開始編寫中間件,但存在一個優秀的nuget package可幫助您更快地實現目標。 最後,請求的主體只能用一次(至少安全),因爲它是實現see related github issue
我只是想延長baywet的答案的方式消耗掉。
如果可以,我建議使用現有的nuget package來擴展Application Insights和OWIN。在這種情況下,您至少需要.NET Framework 4.6.1。
否則,您可以使用「我的」解決方案。我剛纔混合theese兩個答案:
我需要的是記錄異常和請求。這就是我所做的...(在這裏我寫出了讓你寫出一個工作解決方案的基本要素)。
我創建了兩個不同的對象跟蹤器:TrackerException
和TrackerRequest
。兩者都實施Proxy Pattern。通過這種方式,我不必顯然在乎我決定追蹤的內容。我只是讓你看到一個簡單的實現一個跟蹤器:
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包。
我正在使用OWIN和Application Insights,但由於與我的.NET框架不兼容,我無法安裝nuget軟件包。目前我無法更新.NET框架版本。我怎樣才能讀取請求流? – Ciccio
這可能是一個目標框架設置問題,我建議你發佈一個關於該問題的單獨問題。不要猶豫,在這裏鏈接它。 – baywet
是的,我認爲是這樣..我有框架4.5.1 ...我讀過很多新的框架/插件(不僅這一個)支持框架4.5.2+ .. 此刻我試圖這一個https://stackoverflow.com/a/35953383/968759 +這一個https://stackoverflow.com/a/37363258/968759 我會看到會發生什麼......否則我發佈一個新的問題...謝謝您! – Ciccio