2012-04-05 8 views
1

ユーザーが自分のサイトに情報を入力して例外を経験した場合、その例外をキャプチャする最も良い方法は何ですか?私は、例外が発生したときにフォーム上で何が記入されたのかを知りたいと思います。どのように扱ったのですか?どのツールを使っていますか?私はELMAHとlog4netを調べて、現在この情報を取得するためにlog4netを使用しようとしています。フォームフィールドをキャプチャする最良の方法は何ですか?例外時にユーザーエクスペリエンスを取得する

答えて

1

Global.asax.csのApplication_Errorでは、次のものにアクセスしてログに記録することができます。これは私たちが行うことです(具体的な内容は削除されています)。

明らかに、それぞれvar whatever = ...の代わりにLogInSomeWay(whatever)を実行します。このコードは、現在の経験の各重要な部分を変数に割り当てることを示しています。

これが役に立ちます。我々はELMAHを使用してきたいくつかのプロジェクトで

コード

void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    HttpContext context = HttpContext.Current; 

    bool requestAvailable = false; 
    try 
    { 
     if (context.Request != null) 
     { 
      requestAvailable = true; 
     } 
    } 
    catch{} 

    if (context != null) var serverName = context.Server.MachineName; 

    if (context != null && requestAvailable) 
    { 
     var referrer = context.Request.UrlReferrer != null ? context.Request.UrlReferrer.ToString() : ""; 

     // If you use forms authentication and define your own principal, do some logging with it here 
     OurPrincipal user = OurContext.Current.LoggedOnPrincipal; 
     if (user != null && user.Identity != null && user.Identity.IsAuthenticated && user.Person != null) 
     { 
      var logonName = user.Person.LogonName; 
      var loginPersonName = user.Person.FirstName + " " + user.Person.LastName; 
     } 

     var userIP = context.Request.UserHostAddress; 
     var userDns = context.Request.UserHostName; 
     var userAgent = context.Request.UserAgent; 
     var exceptionText = ex.ToString(); 

     foreach (string key in context.Request.ServerVariables.AllKeys) 
     { 
      var currentServerVarKey = key; 
      var currentServerVarValue = context.Request.ServerVariables[key]; 
     } 

     if (context.Request.ServerVariables["REQUEST_METHOD"] == "POST" 
      && context.Request.Form != null && context.Request.Form.AllKeys != null) 
     { 
      foreach (string key in context.Request.Form.AllKeys) 
      { 
       var currentFormKey = key; 
       var currentFormValue = context.Request.Form[key]; 
      } 
     } 
    } 
} 
+0

ありがとうChris ..コンソールアプリケーションのようにasp.netアプリケーションの外でHttpContext.Requestをテストするにはどうすればいいですか?私はMoqを探していますが、それは複雑に見えます。私にお知らせください。ありがとう –

+0

@ dotnet-practitionerは、そのメソッドを抽象化し、ラップされた['HttpContextBase'](http://www.codethinked.com/using-systemwebabstractions-in-your-webforms-apps)に渡します。次に、HttpContextの代わりに 'HttpContextBase'のインスタンスを使ってテストします。 –

+0

@ dotnet-practitionerもし私が尋ねることができるなら、あなたはなぜもっと詳細な答えを受け入れなかったのですか? –

1

Global.Asaxにアプリケーションエラーハンドラを登録してからHttpContext.Currentにアクセスして、&フォームの値を取得することができます。

protected void Application_Error(Object sender, EventArgs e) 
{ 
    HttpContext currentContext= HttpContext.Current; 

    // set the exception to the Context 
    Exception exception = currentContext.Server.GetLastError(); 

...

あなたは、あなたが合うように、この情報を保存/ログインすることができます。

1

が、私は何とかそれを好きではありません。 (私の個人的な経験だけど)ELMAHでフィルタされたエラーログを読む能力は素晴らしいですが、それはそれです。

私自身のエラーハンドラを書いた経験がありました。 1つの方法は、Application_Errorイベントを購読することです。
カスタムヘルスモニタリングプロバイダを作成することもできます。私はここでそのトピックについて書いています:http://www.tomot.de/en-us/article/6/asp.net/how-to-create-a-custom-healthmonitoring-provider-that-sends-e-mails
例外を投げたフォームへの参照を取得し、すべてのControl/TextBoxを繰り返してその値を取得することは可能でしょうか。

関連する問題