2017-10-09 19 views
0

未処理の例外が発生したときにhttpcontextでエラー応答を返す必要があるASP.net Webサイトで作業しています。消費者がログオン目的でのみサイトにアクセスし、応答以外のページは表示されないため、別のページにリダイレクトできません。応答を操作するASP.Net未処理例外ハンドラ

私はSystem.Web.Http.ExceptionHandlerを使用すると考えましたが、私のサイトには.Net 3.5フレームワークがなくなり、使用できません。

誰かが私に何ができるか考えてもらえますか?すべての例外をトラップし、次の形式のエラーメッセージを含むhttpresponseを送信する共通のhttpモジュールが必要です。

​​

答えて

0

私は、Global.asaxのコードで、次の(VBから変換された)ん

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    Server.ClearError(); 

    Logging.LogError(exception); 
    //Get a HTML file stored in resources which contains my error text and some tokens to replace. 
    dynamic html = My.Resources.ErrorText; 
    html = html.Replace("{Title}", Server.HtmlEncode(My.Application.Info.Title)); 
    html = html.Replace("{Product}", Server.HtmlEncode(My.Application.Info.ProductName)); 
    html = html.Replace("{Version}", Server.HtmlEncode(My.Application.Info.Version.ToString)); 

    //Build my exception message looping though all the inner exceptions 
    dynamic errorDetails = exception.Message + Constants.vbNewLine + exception.StackTrace; 

    while (exception.InnerException != null) { 
     exception = exception.InnerException; 
     errorDetails += Constants.vbNewLine + Constants.vbNewLine + "Inner Exception: " + Constants.vbNewLine + exception.Message + Constants.vbNewLine + exception.StackTrace; 
    } 

    //Replace the {ErrorDetails} tag with my error text 
    html = html.Replace("{ErrorDetails}", Server.HtmlEncode(errorDetails).Replace(Constants.vbNewLine, "<br/>")); 

    //Replace the logo tag 
    using (IO.MemoryStream ms = new IO.MemoryStream()) { 
     using (img == My.Resources.Logo) { 
      img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      dynamic logoBytes = ms.ToArray; 
      html = html.Replace("{Logo}", "data:image/png;base64," + Convert.ToBase64String(logoBytes, 0, logoBytes.Length)); 
     } 
    } 

    //Replace the response 
    Response.Clear(); 
    Response.Write(html); 
    Response.Flush(); 
} 

HttpModuleをの初期化にしてHttpApplication.Errorイベントにイベントハンドラを追加することが可能でなければなりません同じことをする。 Initメソッドに渡されるhttps://msdn.microsoft.com/en-us/library/system.web.httpapplication_events(v=vs.110).aspxを参照してください。https://msdn.microsoft.com/en-us/library/system.web.ihttpmodule(v=vs.110).aspx

+0

httpモジュールで再利用できるようにすることは可能ですか? – Ramki

+0

httpmoduleのinitのHttpApplication.Errorイベントにイベントハンドラを追加することができるように見えます。 https://msdn.microsoft.com/en-us/library/system.web.httpapplication_events(v=vs.110).aspxおよびhttps://msdn.microsoft.com/en-us/library/systemを参照してください。 web.ihttpmodule(v = vs.110).aspx – apc