8

ServiceStack で特定のサービスに対して実行されるリクエスト/レスポンス インターセプターをセットアップする最も簡単な方法は何でしょうか?

リクエスト フィルタ ( ) は正常に機能しますが、サービスが非 2xx ステータス コードを返した場合、IHasRequestFilterレスポンス フィルタ ( ) はトリガーされません。IHasResponseFilterメソッドから返されたステータス コードと、応答 DTO (存在する場合) を取得する必要があります。

カスタム ServiceRunner とメソッドのオーバーライドはOnBeforeExecuteうまくOnAfterExecuteいくようですが、アプリケーション全体でサービスランナーを置き換える必要があり、必要なタスクを機能ごとに分離するクリーンな方法を見つけることができなかったため、かなり煩わしいと思います。それらのメソッドで実行されます。

各サービスメソッドの前と各サービスメソッドの後にいくつかのコードを実行できるようにする、欠落している ServiceStack の拡張ポイントはありますか? プラグインは理想的ですが、カスタム コードを実行できるようにする架空のメソッドBeforeExecuteをサブスクライブするにはどうすればよいでしょうか?AfterExecute


アップデート:

質問を投稿した直後に、サービスから返されたステータス コードに関係なく、グローバル レスポンス フィルタが実行されることがわかりました。これはまさに私が必要としていたものです。最後の質問: リクエスト フィルターでリクエストを処理するサービス タイプを取得することは可能ですか? このサービスが何らかのカスタム マーカー属性で装飾されているかどうかを確認する必要があります。

4

3 に答える 3

3

カスタム リクエスト/レスポンス フィルタでサービス タイプを取得する方法に関する質問の解決策を見つけました。

appHost.RequestFilters.Add((req, res, requestDto) =>
{
    var metadata = EndpointHost.Metadata;
    Type serviceType = metadata.GetServiceTypeByRequest(requestDto.GetType());

    ...
}
于 2013-07-08T16:19:40.260 に答える
3

カスタム ServiceRunner と OnBeforeExecute および OnAfterExecute メソッドのオーバーライドは正常に機能しているように見えますが、アプリケーション全体でサービス ランナーを置き換える必要があるため、かなり煩わしいと思います。

簡単に言うと、オプトインして、カスタム サービス ランナーを使用する必要があるリクエストのみを選択できます。

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
  ActionContext actionContext)
{           
    return useCustomRunner(actionContext.RequestType)
      ? new MyServiceRunner<TRequest>(this, actionContext)
      : base.CreateServiceRunner<TRequest>(actionContext);
}
于 2013-07-08T16:30:48.177 に答える
2

IHttpRequest には OperationName があります。私はそれがあなたが求めているものだと思います。

于 2013-07-08T14:38:48.533 に答える