1

呼び出されるRequestFilterの情報に基づいて、条件付きで実行される を実装しようとしています。を見つけて、メソッド/インターフェイス/属性を調べ、それに基づいて条件付きで作業を行いServiceたいと思います。RequestFilterService

RequestFilterAttributeで aを宣言できることは承知していますがService、条件付きにする良い方法がわかりませんでした。デリゲート/ラムダを属性に渡したかったのですが、C# では許可されていません。そこにタイプまたはタイプ名をプラグインしてRequestFilterAttribute、クラス/メソッドを見つけることができましたServiceが、コピー/貼り付けエラーが発生しやすいようでした。

そのため、RequestFilterまたはが動作している (または宣言されている) ことRequestFilterAttributeを知る方法が必要であり、その内部でフィルターのコードを有効/無効にするために必要なロジックを提供するメソッドを検索したいと考えています。IoC コンテナーの何らかの機能がこれを提供したのか、それとも別の方法でそれを行うことができたのか、私にはわかりませんでした。ServiceService

次に、フィルターの実行方法に基づいて、サービスが実際に実行されるのをブロックして、独自のデータを返す必要がある場合があります。これは可能ですか?(それに対する答えですか?)

4

1 に答える 1

3

これが鍵のようです:

var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDto.GetType());

これは、リクエストを処理するサービスのタイプを返します。これはインスタンスではありません (ただし、サービス インスタンスがまだ作成されているとは思えません) ため、条件付きロジックを実行するには、静的メソッドを定義してから検索する必要がありました。リフレクションを使用して、特別な属性を宣言するメソッドを見つけました。最高のパフォーマンスを得るには、それを最適化する必要があります。

そこから、何らかのロジックを実行するかどうかを条件付きで決定できます。必要に応じてサービスの呼び出しをバイパスし、次のように成功の応答を返すこともできます。

var successResponse = DtoUtils.CreateSuccessResponse(successMessage);
var responseDto = DtoUtils.CreateResponseDto(requestDto, successResponse);
var contentType = req.ResponseContentType;
res.ContentType = contentType;
res.WriteToResponse(req, responseDto);
// this is the proper way to close the request; you can use Close() but it won't write out global headers
res.EndServiceStackRequest();
return;

または、エラー応答を作成するか、単に から戻っRequestFilterてサービスを正常に実行させることができます。

于 2013-03-10T06:34:35.820 に答える