を使用して応答を圧縮する ServiceStack サービスがありますRequestContext.ToOptimizedResult()
。
[Route("/numbers/search")]
public class FindNumbers
{
}
public object Get(FindNumbers query)
{
var data = new List<string> { "One", "Two", "Three" };
return RequestContext.ToOptimizedResult(data);
}
これは、次のようなリクエストを発行するときに完全に機能します。
GET http://myhost:13487/numbers/search.json
そして、Accept-Encoding
要求ヘッダーで期待どおりに圧縮されます。
Accept-Encoding: gzip,deflate,sdch
JSONP リクエストを発行することもできます。
GET http://myhost:13487/numbers/search?callback=func
コールバックを正しく返しapplication/javascript
ます(圧縮されていません)。
問題
リクエスト ヘッダーを JSONP リクエストに追加するAccept-Encoding
と、レスポンスは圧縮されたapplication/javascript
コールバックではなく、元の JSON リクエストに従って圧縮された JSON データになります。
この動作に欠けている明らかな理由はありますか、それとも単に ServiceStack のバグですか? 私の期待は、応答で圧縮された JSONP コールバックを受け取ることですが、私は JSONP にかなり慣れており、フォールバックには十分な理由があるかもしれません。
注意してください、私はServiceStackソースを調べていますが、1つよりも多くの頭脳が優れているため、これを公開すると考えました...
前もって感謝します
編集
そのため、次のソースで問題を追跡しました
と
if (doJsonp && !(response is CompressedResult))
return httpRes.WriteToResponse(httpReq, response, (callback + "(").ToUtf8Bytes(),")".ToUtf8Bytes());
return httpRes.WriteToResponse(httpReq, response);
したがって、応答が圧縮された結果である場合、応答を介し?callback=func
た JSONP の要件に関係なく、圧縮された json (上記の例の場合) が含まれます。これは、上記の調査結果に当てはまります。そのため、jsonp コールバック ラッパーをコールスタックの早い段階で適用する必要があるようです。