すべてのASMXWebサービスクラスが継承する共通の基本クラスがあります。コンストラクターでは、いくつかの一般的な認証チェックを実行したいと思います。それらが失敗した場合、私はすぐに処理を停止し(サブクラスのコードは実行されません)、呼び出し元に401ステータスコード応答を返したいと思います。
ただし、これを行う一般的なASPXのような方法は機能しないようです。
- Context.Response.End(); 500ステータスコードの応答内で、常にThreadAborted例外を呼び出し元にキックバックします。End()を呼び出す前にContext.Response.StatusCode = 401を明示的に設定しても、無視されます。結果は500応答のままであり、メッセージは常に「thread-aborted-exception」です。
- MSDNでは、代わりにHttpContext.Current.ApplicationInstance.CompleteRequest()を使用することをお勧めします。ただし、これによってダウンストリーム処理が停止することはありません。サブクラスの関数は、コンストラクターが何もしなかったかのように実行されます。(一種のコンストラクターで許可をチェックする目的を無効にします。)
- 新しいHttpExceptionをスローできます。これは、ダウンストリーム処理を防止するという点で少し優れており、少なくとも、呼び出し元に返される例外メッセージを制御できます。ただし、応答が常に500であるという点で、完全ではありません。
- DoProcessingインスタンス変数を定義し、コンストラクター内でtrue/falseに設定できます。次に、すべてのサブクラスのすべてのWebMethodに、その機能をif(DoProcessing)ブロック内にラップさせます...しかし、それに直面しましょう、それは恐ろしいことです!
この種の機能を実装するためのより良い/より徹底的な方法があるので、それは私のすべてのASMXクラスに共通ですか?
編集:それがおそらく最良のアプローチであるため、ジョンの答えを受け入れる。ただし、クライアントが追加のサードパーティコードを採用することを躊躇し、AOPを使用したある程度のFUDがあるため、このアプローチは採用しませんでした。上記のオプション#3は、実装の速度と柔軟性のバランスが最もよく、要件を満たしているように見えたため、最終的にはオプション3を選択しました。