2

ServiceStack に新しいコンテンツ タイプを登録しました。

appHost.ContentTypeFilters.Register("application/x-my-content-type", 
   SerializeToStream, DeserializeFromStream);

クライアントが http ストリームでコンテンツ タイプを送信すると、すべてが期待どおりに機能します。

残念ながら、HTTP リクエスト ヘッドを制御できず、コンテンツ タイプを送信しないクライアントがあります。

ServiceStack にそのルートのデフォルトのコンテンツ タイプを設定させるにはどうすればよいですか?

4

1 に答える 1

9

すべての ServiceStack /metadata ページには、クライアントが特定の Content-Type を要求できるさまざまな方法がリストされています。

クライアントの HTTP AcceptヘッダーでContent-type をオーバーライドするには、 ?format=xmlを追加するか、または を追加します。フォーマット拡張子

たとえば、クライアントは?format=x-my-content-typeを使用してカスタム ContentType を指定し、拡張子を追加する.x-my-content-typeか、(HttpClient で) HTTP ヘッダーを指定することによって指定できます。

Accept: application/x-my-content-type

それ以外の場合、HttpClient が Accept ヘッダーを送信しない場合は、AppHost で既定のコンテンツ タイプを次のように指定できます。

SetConfig(new HostConfig {
     DefaultContentType = "application/x-my-content-type"
});

注: ServiceStack のすべての構成オプションは on に設定されていHostConfigます。

Web ブラウザーから Web サービスを呼び出す場合の問題は、サービスAccept: text/htmlスタックが HTML が有効になっている場合に HTML を返すことを契約によって要求することが一般的であることです。

Content-Type が常に返されるようにするには、次の方法で HTML 機能を無効にすることもできます。

SetConfig(new HostConfig {
    EnableFeatures = Feature.All.Remove(Feature.Html),
});

それ以外の場合は、Acceptヘッダーをオーバーライドする場合は、HttpResult 内で Response DTO を装飾することにより、サービスが常に Content-Type を返すように強制できます。つまり、次のようになります。

return new HttpResult(dto, "application/x-my-content-type");

それ以外の場合は、サービスの外部 (リクエスト/レスポンス フィルタなど) のどこにでも、次のようにアクセスできる場所ならどこでもレスポンスの ContentType を設定できますIHttpRequest

httpReq.ResponseContentType = "application/x-my-content-type";
于 2012-09-07T23:56:19.250 に答える