SignalR с сжатием gzip
возникли проблемы с разработкой клиента SignalR для концентратора, размещенного в asp.net веб-сайт с включенным сжатием gzip. Поскольку мы используем сжатие IIS, ответ от SignalR также сжимается, но клиент не понимает ответ, и мы получаем ошибку синтаксического анализа Json на стороне клиента.
SignalR внутренне использует HttpWebRequest чтобы сделать запросы http и HttpWebRequest можно настроить для автоматической распаковки ответа с помощью AutomaticDecompression собственность. Итак, если каким-то образом я могу достать HttpWebRequest объект, используемый SignalR для запроса, я должен иметь возможность установить автоматическую декомпрессию enable.
я думал, что смогу получить доступ к HttpWebRequest на предоставление HubConnection.Start С моей пользовательской реализации IHttpClient, IHttpClient.GetAsync принимает prepareRequest действие, которое, как я думал, должно дать мне доступ к HttpWebRequest, но, HttpHelper.GetAsync обертывания HttpWebRequest С HttpWebRequestWrapper до prepareRequest и HttpWebRequestWrapper не предоставляет доступ к HttpWebRequest.
HttpHelper класс является внутренним, поэтому не может его использовать, поэтому я не совсем уверен, как включить автоматическую декомпрессию с SignalR.
я могу подвергнуть HttpWebRequest на HttpWebRequestWrapper, но предпочел бы более простое решение, если оно существует. Есть идеи?
я использую SignalR версии 0.5.1.10822
моя автоматическая декомпрессия HttpClient:
public class HttpClientWithAutoDecompression : IHttpClient
{
readonly DefaultHttpClient _httpClient = new DefaultHttpClient();
private readonly DecompressionMethods _decompressionMethods;
public HttpClientWithAutoDecompression(DecompressionMethods decompressionMethods)
{
_decompressionMethods = decompressionMethods;
}
public Task<IResponse> GetAsync(string url, Action<IRequest> prepareRequest)
{
Task<IResponse> task = _httpClient.GetAsync(url,
request =>
{
[ERROR: request is actually HttpRequestWrapper and
does not expose HttpWebRequest]** ]
var httpWebRequest = (HttpWebRequest) request;
httpWebRequest.AutomaticDecompression = _decompressionMethods;
prepareRequest(request);
});
return task.ContinueWith(response =>
{
Log.Debug(this, "Response: {0}", response.Result.ReadAsString());
return response.Result;
});
}
....
}
1 ответов
насколько мне известно, кодировка и потоковая передача GZip не смешиваются. В случае транспорта forever frame клиент не сможет декодировать содержимое потоковой передачи, пока не будет получен весь ответ или, по крайней мере, значительный блок данных (из-за способа декодирования данных). В случае веб-сокетов в настоящее время нет поддержки кодирования любого рода, хотя, по-видимому, существует расширение спецификации для кодирования каждого сообщения будучи работал на.
тем не менее, если вы хотите попытаться обеспечить поддержку для LongPolling транспорта, единственный способ, я вижу, что это возможно, чтобы обеспечить свой собственный SignalR IHttpClient реализация. Вы можете видеть прямо сейчас, что DefaultHttpClient класс использует HttpHelper::GetAsync создает HttpWebRequest внутренне, и вы никогда не сможете получить доступ к этому, потому что у вас есть только доступ к IRequest что это HttpWebRequestWrapper в этой точке.
создав свой собственный IHttpClient вы можете возьмите на себя начальный экземпляр HttpWebRequest, выберите AutomaticDecompression а затем заверните это сами с HttpWebRequestWrapper.