11using System ;
2+ using System . Collections . Generic ;
3+ using System . Reflection ;
24using Exceptionless . Plugins ;
35using Microsoft . AspNetCore . Http ;
4- using Microsoft . Extensions . DiagnosticAdapter ;
56
67namespace Exceptionless . AspNetCore {
7- public sealed class ExceptionlessDiagnosticListener {
8+ public sealed class ExceptionlessDiagnosticListener : IObserver < KeyValuePair < string , object > > {
9+ private const string HandledExceptionEvent = "Microsoft.AspNetCore.Diagnostics.HandledException" ;
10+ private const string DiagnosticsUnhandledExceptionEvent = "Microsoft.AspNetCore.Diagnostics.UnhandledException" ;
11+ private const string HostingUnhandledExceptionEvent = "Microsoft.AspNetCore.Hosting.UnhandledException" ;
12+ private const string MiddlewareExceptionEvent = "Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException" ;
813 private readonly ExceptionlessClient _client ;
914
1015 public ExceptionlessDiagnosticListener ( ExceptionlessClient client ) {
1116 _client = client ;
1217 }
1318
14- [ DiagnosticName ( "Microsoft.AspNetCore.Diagnostics.HandledException" ) ]
15- public void OnDiagnosticHandledException ( HttpContext httpContext , Exception exception ) {
16- var contextData = new ContextData ( ) ;
17- contextData . SetSubmissionMethod ( "Microsoft.AspNetCore.Diagnostics.HandledException" ) ;
18-
19- exception . ToExceptionless ( contextData , _client ) . SetHttpContext ( httpContext ) . Submit ( ) ;
19+ public void OnCompleted ( ) { }
20+
21+ public void OnError ( Exception error ) { }
22+
23+ public void OnNext ( KeyValuePair < string , object > diagnosticEvent ) {
24+ switch ( diagnosticEvent . Key ) {
25+ case HandledExceptionEvent :
26+ SubmitException ( diagnosticEvent . Value , diagnosticEvent . Key , false ) ;
27+ break ;
28+ case DiagnosticsUnhandledExceptionEvent :
29+ case HostingUnhandledExceptionEvent :
30+ SubmitException ( diagnosticEvent . Value , diagnosticEvent . Key , true ) ;
31+ break ;
32+ case MiddlewareExceptionEvent :
33+ string middlewareName = GetPropertyValue ( diagnosticEvent . Value , "name" ) as string ;
34+ SubmitException ( diagnosticEvent . Value , middlewareName ?? diagnosticEvent . Key , true ) ;
35+ break ;
36+ }
2037 }
2138
22- [ DiagnosticName ( "Microsoft.AspNetCore.Diagnostics.UnhandledException" ) ]
23- public void OnDiagnosticUnhandledException ( HttpContext httpContext , Exception exception ) {
24- var contextData = new ContextData ( ) ;
25- contextData . MarkAsUnhandledError ( ) ;
26- contextData . SetSubmissionMethod ( "Microsoft.AspNetCore.Diagnostics.UnhandledException" ) ;
39+ private void SubmitException ( object payload , string submissionMethod , bool isUnhandledError ) {
40+ if ( payload == null )
41+ return ;
2742
28- exception . ToExceptionless ( contextData , _client ) . SetHttpContext ( httpContext ) . Submit ( ) ;
29- }
43+ var httpContext = GetPropertyValue ( payload , "httpContext" ) as HttpContext ;
44+ var exception = GetPropertyValue ( payload , "exception" ) as Exception ;
45+ if ( httpContext == null || exception == null )
46+ return ;
3047
31- [ DiagnosticName ( "Microsoft.AspNetCore.Hosting.UnhandledException" ) ]
32- public void OnHostingUnhandledException ( HttpContext httpContext , Exception exception ) {
3348 var contextData = new ContextData ( ) ;
34- contextData . MarkAsUnhandledError ( ) ;
35- contextData . SetSubmissionMethod ( "Microsoft.AspNetCore.Hosting.UnhandledException" ) ;
49+ if ( isUnhandledError )
50+ contextData . MarkAsUnhandledError ( ) ;
51+ contextData . SetSubmissionMethod ( submissionMethod ) ;
3652
3753 exception . ToExceptionless ( contextData , _client ) . SetHttpContext ( httpContext ) . Submit ( ) ;
3854 }
3955
40- [ DiagnosticName ( "Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException" ) ]
41- public void OnMiddlewareException ( HttpContext httpContext , Exception exception , string name ) {
42- var contextData = new ContextData ( ) ;
43- contextData . MarkAsUnhandledError ( ) ;
44- contextData . SetSubmissionMethod ( name ?? "Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException" ) ;
45-
46- exception . ToExceptionless ( contextData , _client ) . SetHttpContext ( httpContext ) . Submit ( ) ;
56+ private static object GetPropertyValue ( object payload , string propertyName ) {
57+ return payload . GetType ( )
58+ . GetProperty ( propertyName , BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . IgnoreCase ) ?
59+ . GetValue ( payload ) ;
4760 }
4861 }
49- }
62+ }
0 commit comments