2017-08-17 37 views

回答

2

OWIN引入中間件的,需要你建立層應用程序的概念(已被延長asp.net核心版本)。
其中一個主要原因是它可以提高可維護性,性能以及高度分散關注點。
在這個過程中,他們刪除了大部分靜態上下文變量(如httpContext.Current),OWIN基礎設施將等價信息作爲OwinContext傳遞給中間件。
這就是說,如果您正在使用Application Insights,則無需從頭開始編寫中間件,但存在一個優秀的nuget package可幫助您更快地實現目標。 最後,請求的主體只能用一次(至少安全),因爲它是實現see related github issue

+0

我正在使用OWIN和Application Insights,但由於與我的.NET框架不兼容,我無法安裝nuget軟件包。目前我無法更新.NET框架版本。我怎樣才能讀取請求流? – Ciccio

+1

這可能是一個目標框架設置問題,我建議你發佈一個關於該問題的單獨問題。不要猶豫,在這裏鏈接它。 – baywet

+0

是的,我認爲是這樣..我有框架4.5.1 ...我讀過很多新的框架/插件(不僅這一個)支持框架4.5.2+ .. 此刻我試圖這一個https://stackoverflow.com/a/35953383/968759 +這一個https://stackoverflow.com/a/37363258/968759 我會看到會發生什麼......否則我發佈一個新的問題...謝謝您! – Ciccio

0

我只是想延長baywet的答案的方式消耗掉。

如果可以,我建議使用現有的nuget package來擴展Application Insights和OWIN。在這種情況下,您至少需要.NET Framework 4.6.1

否則,您可以使用「我的」解決方案。我剛纔混合theese兩個答案:

我需要的是記錄異常和請求。這就是我所做的...(在這裏我寫出了讓你寫出一個工作解決方案的基本要素)。

我創建了兩個不同的對象跟蹤器:TrackerExceptionTrackerRequest。兩者都實施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包。

相關問題