3

AcceptServiceStack サービスは、ヘッダーで要求されたコンテンツ タイプで応答するのに最適です。しかし、リクエスト フィルター内からレスポンスを早期に閉じる/終了する必要がある場合、適切なコンテンツ タイプでレスポンスする方法はありますか? リクエストフィルターでアクセスできるのは生の IHttpResponse だけなので、唯一のオプションは、退屈で手動でAcceptヘッダーをチェックし、一連の switch/case ステートメントを実行して、使用するシリアライザーを特定し、直接書き込むことです。にresponse.OutputStream

質問をさらに説明するために、通常のサービス メソッドでは、次のようなことができます。

public object Get(FooRequest request)
{
    return new FooResponseObject()
    {
        Prop1 = "oh hai!"
    }
}

また、ServiceStack は、使用するコンテンツ タイプと使用するシリアライザーを判断します。リクエスト フィルタ内でこれと同様のことができますか?

4

1 に答える 1

2

ServiceStackは、多くの要素 (Accept: ヘッダー、QueryString など) に基づいて Requested Content-Type を事前に計算し、この情報をhttpReq.ResponseContentTypeプロパティに保存します。

IAppHost.ContentTypeFiltersこれを ServiceStack に登録されたすべての Content-Type シリアライザー (つまり、組み込み + カスタム) のコレクションを格納するレジストリと共に使用して、次のようなことを行うことができます。

var dto = ...;
var contentType = httpReq.ResponseContentType;
var serializer = EndpointHost.AppHost
    .ContentTypeFilters.GetResponseSerializer(contentType);

if (serializer == null)
   throw new Exception("Content-Type {0} does not exist".Fmt(contentType));

var serializationContext = new HttpRequestContext(httpReq, httpRes, dto);
serializer(serializationContext, dto, httpRes);
httpRes.EndServiceStackRequest(); //stops further execution of this request

注: これは、応答を出力ストリームにシリアル化するだけで、通常の ServiceStack 要求のように、他の要求フィルターや応答フィルター、または他のユーザー定義のフックを実行しません。

于 2012-12-13T00:53:30.387 に答える