ServiceStack - Usando compactação gzip / deflate com solicitações JSONP
Eu tenho um serviço ServiceStack que comprime a resposta usandoRequestContext.ToOptimizedResult()
, por exemplo.:
[Route("/numbers/search")]
public class FindNumbers
{
}
public object Get(FindNumbers query)
{
var data = new List<string> { "One", "Two", "Three" };
return RequestContext.ToOptimizedResult(data);
}
Isso funciona perfeitamente ao emitir uma solicitação como:
GET http://myhost:13487/numbers/search.json
E é comprimido como esperado com oAccept-Encoding
cabeçalho da solicitação:
Accept-Encoding: gzip,deflate,sdch
Eu também posso emitir uma solicitação JSONP:
GET http://myhost:13487/numbers/search?callback=func
que retorna corretamente umapplication/javascript
retorno de chamada (não compactado).
Quando eu adiciono oAccept-Encoding
solicita o cabeçalho para o pedido JSONP, a resposta são os dados JSON compactados de acordo com a solicitação JSON original, e não uma solicitação compactadaapplication/javascript
ligue de volta.
Existem quaisquer razões óbvias que eu estou sentindo falta deste comportamento, ou é simplesmente um bug no ServiceStack? Minha expectativa seria receber um retorno de chamada JSONP compactado na resposta, mas sou razoavelmente ecológico com JSONP e pode haver uma boa razão para o fallback.
Note, eu estou em progresso de trabalhar com a fonte ServiceStack, mas eu percebi que eu conseguiria isso como mais cérebros são melhores que um ...
desde já, obrigado
EDITAR
Então, eu rastreei a questão pela seguinte fonte
e
if (doJsonp && !(response is CompressedResult))
return httpRes.WriteToResponse(httpReq, response, (callback + "(").ToUtf8Bytes(),")".ToUtf8Bytes());
return httpRes.WriteToResponse(httpReq, response);
Então, se a resposta for um resultado compactado, então, independentemente do requisito para JSONP via?callback=func
a resposta conterá simplesmente o json compactado (no caso do exemplo acima), o que soa verdadeiro com minhas descobertas acima. Portanto, parece que o wrapper de retorno de chamada jsonp precisa ser aplicado anteriormente no callstack.