2

シングルページメソッドを持つ Web フォームがあります。私の他の Web アプリは、未処理の例外を Web サーバーのシステム イベント ログに記録します。私が一緒に仕事をしている他の開発者は、イベント ログにアプリ エラーのエントリが表示されることを期待しているので、このアプリにも同じことをしてもらいたいと考えています。

ただし、ページメソッド内のコードの呼び出しから例外がキャッチされたときに、アプリにエラーメールを送信させます。これが発生すると、イベント ログに書き込まれません。注: ページ メソッドは、電子メール通知メソッドを呼び出した後に例外を再スローします。

これまで読んだことから、ASP.Net はデフォルトでエラーをイベント ログに記録しているようです。ページメソッド/Webメソッドについては、基本的にそれを呼び出すクライアントコードに例外をスローするため、同じことが当てはまらないと思います。

イベントログに書き込むように、その例外を適切にバブルアップさせる簡単な方法はありますか? 他のアプリは私が見たものから直接イベント ログに書き込むことはありません。そのため、セキュリティ担当者が多くのことをロックダウンしている (善意で、セキュリティを万全に) ため、アプリケーションが新しいソースを作成できるとは思いません。

[WebMethod]
public static object MyPseudoWebMethod()
{
    try
    {
        // My exception spawning unreliable code here
    }
    catch(Exception ex)
    {
        // Cleanup ...
        this.SendErrorNotification(ex);

        throw; // <-- This doesn't bubble up but I'd love for it to!
    }
}
4

2 に答える 2

1

うーん、興味深い問題です。WebMethod 例外が通常の例外フローに従わないという点で、あなたは正しいです。

Web メソッドが例外をスローした場合、Application_Error イベントは発生しません。これは、XML Web サービスの HTTP ハンドラーが、XML Web サービスの実行中に発生するすべての例外を消費し、Application_Error イベントが呼び出される前に SOAP エラーに変換するためです。

ここから)

上記のページでは、SOAP 拡張機能を使用してその例外を飲み込む前にキャッチすることを提案していますが、そうしたくない場合の方法を次に示します。

1) エラーログに記録したいパラメータを取得する新しい「エラー受信」ASPX ページを作成します。たとえば、このページに「ExceptionDetails」という名前の POST など、キャプチャしたいものを取り込ませます。このページはブラウザーで直接表示されないため、ASPX コントロールなどは必要ありませんが、MasterPage を使用しても問題はありません。

2) この新しいページの背後にあるコードで、送信している POSTS を取得し、必要な詳細を含む例外を新しく作成します。この例外をすぐにスローします。これを行うと、この例外は、他の未処理の例外がアプリでたどるフロー (ログ、電子メールなど) に従うことを意味します。

3) WebMethod JS を呼び出すページで、WebMethod への呼び出しを try-catch でラップします。

4) catch ブロックで、ブラウザーに必要なメッセージを出力し、その新しいエラー受信 ASPX ページへの新しい AJAX 投稿を開始し、そのページで検索させた POST 内容を渡します。

新しい AJAX 呼び出しは、デフォルトではユーザーの認識をまったく変更しません。AJAX 呼び出しはそのページへの新しい要求を開始しますが、ASPX ページ自体は実際には、通常のブラウザー要求ではなく AJAX であることをまったく認識していません。ユーザーの ID などを記録している場合は、現在設定されているすべての Cookie/セッション/認証データを AJAX ページでも使用できます。Firebug などのツールから返された応答を見ると、それが実際には YellowScreenOfDeath の HTML であることがわかります (カスタム 500 ページがある場合を除きます。この場合、その HTML が返されます)。

于 2012-11-08T20:23:10.733 に答える
0

これは、従来の ASMX Web サービスがどのように機能するかを示しています。

唯一の回避策は、それらの使用を停止することです (.NET 2.0 に行き詰まっていない限り、いずれにせよ停止する必要があります)。WCF にはこの問題はありません。

于 2012-11-08T19:00:01.347 に答える