我有一个使用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
请求头时,响应是压缩的 JSON 数据,与原始的 JSON 请求一样,并没有返回一个压缩的 application/javascript
回调函数。
我是否忽略了此行为的任何明显原因,还是这只是 ServiceStack 的一个 bug? 我的期望是收到一个压缩的 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回调包装器需要在调用栈中尽早应用。