【发布时间】:2013-11-11 01:02:56
【问题描述】:
我有一个使用 RequestContext.ToOptimizedResult() 压缩响应的 ServiceStack 服务,例如:
[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 回调(未压缩)。
问题
当我将 Accept-Encoding 请求标头添加到 JSONP 请求时,响应是按照原始 JSON 请求压缩的 JSON 数据,而不是压缩的 application/javascript 回调。
是否有任何明显的原因让我错过了这种行为,或者它只是 ServiceStack 中的一个错误?我的期望是在响应中收到一个压缩的 JSONP 回调,但我对 JSONP 相当熟悉,并且可能有充分的理由进行回退。
请注意,我正在研究 ServiceStack 源代码,但我想我会得到这个,因为更多的大脑比一个更好......
提前致谢
编辑
所以,我已经将问题追溯到以下来源
和
if (doJsonp && !(response is CompressedResult))
return httpRes.WriteToResponse(httpReq, response, (callback + "(").ToUtf8Bytes(),")".ToUtf8Bytes());
return httpRes.WriteToResponse(httpReq, response);
因此,如果响应是压缩结果,那么无论通过?callback=func 对 JSONP 的要求如何,响应都将仅包含压缩的 json(在上面的示例中),这与我上面的发现相符。所以看起来需要在调用堆栈中更早地应用 jsonp 回调包装器。
【问题讨论】:
标签: c# jsonp gzip servicestack deflate