2016-09-23 41 views
2

web apiでグローバル例外ログを実装しようとしていて、そのエラーIDを持つユーザーにfrienldyメッセージを送信しようとしているので、エラーIDを返すことができますそれを修正することができます。私は両方を実装しています:ASP.NET Web API 2:ExceptionLoggerと例外ハンドラ

  • をSystem.Web.Http.ExceptionHandling.ExceptionLogger
  • System.Web.Http.ExceptionHandling.ExceptionHandler

をここでExceptionLogger抽象クラスをオーバーライドする私のクラスである。

:ここ
public class GlobalExceptionLogger : System.Web.Http.ExceptionHandling.ExceptionLogger 
{ 
    public override void Log(ExceptionLoggerContext context) 
    { 
     LogMessage logMsg = new LogMessage(); 
     logMsg.ID = System.Guid.NewGuid().ToString(); 
     logMsg.MessageType = MessageType.ResourceServerAPI; 
     logMsg.SenderMethod = context.Request.RequestUri != null ? string.Format("Request URL: {0}", context.Request.RequestUri.ToString()) : ""; 
     logMsg.Level = MesageLevel.Error; 
     logMsg.MachineName = Environment.MachineName; 
     logMsg.Message = context.Exception.Message; 

     Logger.LogError(logMsg); 
    } 
} 

は、どのように私は取り扱いしていますエラーです

処理前に例外ログが発生するため、例外ログを例外ハンドラに渡してエンドユーザーに対応するエラーIDを送信する最も良い方法は何ですか?

答えて

2

あなたはHttpRequestMessage.Propertiesにそれを追加することができます。

public static class HttpRequestMessageExtensions 
{ 
    private const string LogId = "LOG_ID"; 

    public static void SetLogId(this HttpRequestMessage request, Guid id) 
    { 
     request.Properties[LogId] = id; 
    } 

    public static Guid GetLogId(this HttpRequestMessage request) 
    { 
     object value; 
     if (request.Properties.TryGetValue(LogId, out value)) 
     { 
      return (Guid) value; 
     } 

     return Guid.Empty; 
    } 
} 

次に、あなたのロガー/ハンドラでこれらの拡張メソッドを使用します。

public class GlobalExceptionLogger : System.Web.Http.ExceptionHandling.ExceptionLogger 
{ 
    public override void Log(ExceptionLoggerContext context) 
    { 
     LogMessage logMsg = new LogMessage(); 
     logMsg.ID = System.Guid.NewGuid().ToString(); 
     logMsg.MessageType = MessageType.ResourceServerAPI; 
     logMsg.SenderMethod = context.Request.RequestUri != null ? string.Format("Request URL: {0}", context.Request.RequestUri.ToString()) : ""; 
     logMsg.Level = MesageLevel.Error; 
     logMsg.MachineName = Environment.MachineName; 
     logMsg.Message = context.Exception.Message; 

     // Set the ID 
     context.Request.SetLogId(logMsg.ID); 

     Logger.LogError(logMsg); 
    } 
} 

public class GlobalExceptionHandler : System.Web.Http.ExceptionHandling.ExceptionHandler 
{ 
    public override void Handle(ExceptionHandlerContext context) 
    { 
     // Get the ID 
     var id = context.Request.GetLogId(); 

     var metadata = new ErrorData 
     { 
      Message = "An error occurred! Please use the ticket ID to contact our support", 
      DateTime = DateTime.Now, 
      RequestUri = context.Request.RequestUri, 
      ErrorId = id 

     }; 

     var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, metadata); 
     context.Result = new ResponseMessageResult(response); 
    } 
} 
関連する問題