2016-04-18 15 views
0

私はcustomErrors mode="RemoteOnly"を使用していますが、エラーの詳細を管理者に電子メール通知で報告したいと考えています。私はどのようににHTTPエラーがスローされたときに詳細なエラー情報をキャプチャするのかわかりませんとビューが呼び出されます - 特にHTTP 500が必要です。エラーコントローラのHTTPエラーの詳細を取得します

コントローラに現在のエラーの詳細を挿入したいと思いますが、< - ここに詳細を追加してください。免責事項:私は、エラーメールやバックグラウンドThreadのパフォーマンスの問題を認識しており、「後で」最適化します。私はMVC 5.2.3.0を使用しています。

マイweb.config

<customErrors mode="RemoteOnly" defaultRedirect="/error/error"> 
    <error statusCode="400" redirect="/error/badrequest" /> 
    <error statusCode="403" redirect="/error/forbidden" /> 
    <error statusCode="404" redirect="/error/notfound" /> 
    <error statusCode="414" redirect="/error/urltoolong" /> 
    <error statusCode="500" redirect="/error/internalserver" /> 
    <error statusCode="503" redirect="/error/serviceunavailable" /> 
</customErrors> 

マイerrorInfoのviewmodel:

namespace MyProject.ViewModels 
{ 
    public class ErrorInfo 
    { 
     public string Code { get; set; } 
    } 
} 

マイErrorController(のみHTTP 500を示す):asp.netのMVCでは

public ActionResult InternalServer() 
{ 
    ErrorInfo errorInfo = new ErrorInfo(); 
    errorInfo.Code = "500 - Internal Server Error"; <-- *ADD DETAILS HERE* 
    SendHttpErrorAsync(errorInfo.Code); 
    return PartialView("Error", errorInfo); 
} 

public void SendHttpErrorAsync(string message) 
{ 
    Thread httpError = new Thread(delegate() 
     { 
      message = User.Identity.IsAuthenticated ? message + " | " + User.Identity.GetUserName() : message + " | anonymous"; 
      message = message + " | " + Request.UserHostAddress; /*(::1 is localhost)*/ 
      try 
      { 
       var requestUri = string.Format("http://ip-api.com/xml/{0}", Request.UserHostAddress); 
       var request = WebRequest.Create(requestUri); 
       var response = request.GetResponse(); 
       var xdoc = XDocument.Load(response.GetResponseStream()); 
       message = (xdoc.Element("query").Element("status").Value == "success") ? message + " | " + xdoc.Element("query").Element("city").Value : message + " | location unvailable"; 
      } 
      catch 
      { 
      } 
      MyProject.Helper.Email.sendErrorEmail(message); 
     }); 
     httpError.IsBackground = true; 
     httpError.Start(); 
    } 

答えて

1

ベストオプションは、Asp.net用のElmahの使用です。すべての機能は既に組み込まれています。

0

を、あなたがキャッチすることができますGlobal.ascxファイルのApplication_Errorイベントのアプリケーションレベルのエラー。ここにはlinkがあります。定義できるのは 次のメソッドをグローバルascxファイルに追加するだけです。

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = HttpContext.Current.Server.GetLastError(); 
    MyProject.Helper.Email.sendErrorEmail((ex.InnerException != null) 
        ? ex.InnerException.Message 
        : ""); 

} 

通常、私はデータベースに例外を記録することをお勧めします。その上に、通知サービスを設定することができます。

関連する問題