2

ServiceStack API (3.9.58) があります。グローバルリクエストフィルターとグローバルレスポンスフィルターを登録するIPluginを実装することにより、statsdを使用してリクエスト実行の時間を計っています(RequestLogFeatureについては知っていますが、これだけではありません)。リクエストが開始されたときにアイテムコレクションに開始済みを貼り付け、Stopwatchリクエストが完了すると再びそれを引き出します。

    .....
    public void Register(IAppHost appHost)
    {
        appHost.RequestFilters.Add(OnBeginRequest);
        appHost.ResponseFilters.Add(OnEndRequest);
    }
    .....

これは非常に効果的です (同じことをするServiceRunnerIRequestLogger行うのと同じように)。

しかし、out-of-the-box を使用して検証を追加するとValidationFeature、要求が検証ルールを満たしていないため、4xx をダンプした要求のタイミング情報を取得できなくなりました。

this SO questionから、ステータスに関係なくグローバル応答フィルターが起動することがわかっています。しかし、私にとってはそうではありません。どこから探し始めるべきですか?

4

1 に答える 1

3

簡単に言えば、グローバル レスポンス フィルタは常に実行されるとは限らず、特定のケースを処理するために追加のタイプのコールバックを登録するか、ServiceRunnerクラスをサブクラス化するなどのアプローチを取る必要があります。

リンクした SO の質問には、「サービスによって返されたステータス コードに関係なく、グローバル レスポンス フィルタが実行される」と記載されています。これが意味することは、サービスが正常に応答オブジェクトを返した場合、グローバル応答フィルターを常に実行する必要があるということです。ただし、サービスまたはプラグインは代わりに例外または呼び出しをスローするEndServiceStackRequest場合があり、その場合、そのアサーションは適用されません。

例外が発生した場合、 は、 に登録したグローバル例外ハンドラServiceRunnerを呼び出します。AppHost

検証エラーのケースを処理するには、AppHost でプラグインとして登録ErrorResponseFilterするオブジェクトのプロパティにコールバック関数を設定できます。ValidationFetaure

別の方法としては、メソッドをサブクラス化ServiceRunnerしてオーバーライドするExecute(および を実装するCreateServiceRunner) か、HTTP モジュールを登録して、リクエストの最後に常に実行される 1 つのコード セットを用意します。

検証が失敗した場合の詳細: ValidationFeature によって設定されたフィルターWriteToResponse、検証が失敗した場合にエラー情報を使用して拡張メソッドを呼び出し、最終的に を呼び出しますEndServiceStackRequest。この場合、ServiceRunner は単純にExecuteメソッドから早期に戻ります。ServiceRunner は、サービス アクションを呼び出したり、応答フィルターを実行したり、OnAfterExecuteメソッドを呼び出したりしません。

于 2013-09-11T15:49:03.967 に答える