2

すべてのASMXWebサービスクラスが継承する共通の基本クラスがあります。コンストラクターでは、いくつかの一般的な認証チェックを実行したいと思います。それらが失敗した場合、私はすぐに処理を停止し(サブクラスのコードは実行されません)、呼び出し元に401ステータスコード応答を返したいと思います。

ただし、これを行う一般的なASPXのような方法は機能しないようです。

  1. Context.Response.End(); 500ステータスコードの応答内で、常にThreadAborted例外を呼び出し元にキックバックします。End()を呼び出す前にContext.Response.StatusCode = 401を明示的に設定しても、無視されます。結果は500応答のままであり、メッセージは常に「thread-aborted-exception」です。
  2. MSDNでは、代わりにHttpContext.Current.ApplicationInstance.CompleteRequest()を使用することをお勧めします。ただし、これによってダウンストリーム処理が停止することはありません。サブクラスの関数は、コンストラクターが何もしなかったかのように実行されます。(一種のコンストラクターで許可をチェックする目的を無効にします。)
  3. 新しいHttpExceptionをスローできます。これは、ダウンストリーム処理を防止するという点で少し優れており、少なくとも、呼び出し元に返される例外メッセージを制御できます。ただし、応答が常に500であるという点で、完全ではありません。
  4. DoProcessingインスタンス変数を定義し、コンストラクター内でtrue/falseに設定できます。次に、すべてのサブクラスのすべてのWebMethodに、その機能をif(DoProcessing)ブロック内にラップさせます...しかし、それに直面しましょう、それは恐ろしいことです!

この種の機能を実装するためのより良い/より徹底的な方法があるので、それは私のすべてのASMXクラスに共通ですか?

編集:それがおそらく最良のアプローチであるため、ジョンの答えを受け入れる。ただし、クライアントが追加のサードパーティコードを採用することを躊躇し、AOPを使用したある程度のFUDがあるため、このアプローチは採用しませんでした。上記のオプション#3は、実装の速度と柔軟性のバランスが最もよく、要件を満たしているように見えたため、最終的にはオプション3を選択しました。

4

2 に答える 2

0

そのための最善の方法は、そのようなシナリオを明示的にサポートしているWCFに切り替えることです。

それでもASMXを使用する必要がある場合は、各Webメソッドから基本クラスのメソッドを呼び出すのが最善の策です。PostSharpのようなものを使用して、すべてのWebメソッドに基本クラスのメソッドを「魔法のように」呼び出させることができます。

于 2010-07-12T22:01:32.207 に答える
0
 Context.Response.Write("My custom response message from constructor");
 Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;       
 Context.Response.End();

そのコードは、コンストラクターの後にWebメソッドを渡すことを防ぎます。

于 2017-04-05T17:47:52.413 に答える