7

を使用して応答を圧縮する 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つよりも多くの頭脳が優れているため、これを公開すると考えました...

前もって感謝します

編集

そのため、次のソースで問題を追跡しました

https://github.com/ServiceStack/ServiceStack/blob/5d09d439cd1a13712411552e2b3ede5a71af2ee5/src/ServiceStack/Host/Handlers/GenericHandler.cs#L79

https://github.com/ServiceStack/ServiceStack/blob/5d09d439cd1a13712411552e2b3ede5a71af2ee5/src/ServiceStack/Host/RestHandler.cs#L107

if (doJsonp && !(response is CompressedResult))
    return httpRes.WriteToResponse(httpReq, response, (callback + "(").ToUtf8Bytes(),")".ToUtf8Bytes());

return httpRes.WriteToResponse(httpReq, response);

したがって、応答が圧縮された結果である場合、応答を介し?callback=funcた JSONP の要件に関係なく、圧縮された json (上記の例の場合) が含まれます。これは、上記の調査結果に当てはまります。そのため、jsonp コールバック ラッパーをコールスタックの早い段階で適用する必要があるようです。

4

1 に答える 1