Después de haber algún problema en el desarrollo de un cliente SignalR para un concentrador alojado en el sitio web asp.net con habilita la compresión gzip. Dado que estamos utilizando la compresión IIS, la respuesta de SignalR también se comprime, pero el cliente no comprende la respuesta y obtenemos un error de análisis Json en el lado del cliente.SignalR wth compresión gzip
SignalR internamente usa HttpWebRequest
para realizar solicitudes http y HttpWebRequest
se puede configurar para descomprimir automáticamente la respuesta usando la propiedad AutomaticDecompression
. Entonces, si de alguna manera puedo obtener el objeto HttpWebRequest
usado por SignalR para realizar la solicitud, debería poder configurar la descompresión automática de habilitación.
pensé que debería ser capaz de obtener acceso a la HttpWebRequest
proporcionando HubConnection.Start
con mi implementación personalizada de IHttpClient
, IHttpClient.GetAsync
realiza una acción prepareRequest
lo que pensé que me debería dar acceso a la HttpWebRequest
, pero, HttpHelper.GetAsync
envuelve el HttpWebRequest
con HttpWebRequestWrapper
antes de pasar a prepareRequest
y HttpWebRequestWrapper
no proporciona acceso a HttpWebRequest
.
HttpHelper
La clase es interna, por lo que no puedo usarla, así que no estoy seguro de cómo habilitar la descompresión automática con SignalR.
Puedo exponer el HttpWebRequest
en HttpWebRequestWrapper
, pero, preferiría una solución más simple si existe. ¿Algún pensamiento?
estoy usando la versión SignalR 0.5.1.10822
Mi automático de descompresión 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;
});
}
....
}
ahora he comprobado en un servidor que también tiene habilitada la compresión gzip y descubrió que SignalR.Client no envía Accept-Encoding: gzip por defecto, por lo que mi servidor responde con un mensaje sin comprimir y todo funciona como se esperaba. Parece que tu cliente envía incorrectamente el encabezado Aceptar codificación o tu servidor fuerza cada respuesta a gzip (que la compresión integrada de IIS no tiene). ¿Puedes verificar con Fiddler qué está pasando? –