在啓用了gzip壓縮功能的asp.net網站中託管的Hub的開發SignalR客戶端時遇到了一些問題。由於我們使用IIS壓縮,SignalR的響應也會被壓縮,但客戶端並不理解響應,並且客戶端會收到Json解析錯誤。SignalR wth gzip壓縮
SignalR內部使用HttpWebRequest
來使make http請求和HttpWebRequest
可以配置爲使用AutomaticDecompression
屬性自動解壓縮響應。所以,如果能以某種方式獲得SignalR使用的HttpWebRequest
對象發出請求,我應該能夠設置啓用自動解壓縮。
,我想我應該能夠通過提供HubConnection.Start
我的IHttpClient
自定義實現來獲得訪問HttpWebRequest
,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;
});
}
....
}
現在我已經檢查了也啓用了gzip壓縮,並發現SignalR.Client不發送的Accept-Encoding的服務器上:在默認情況下的gzip,所以我的服務器未壓縮的消息作出響應,一切都按預期工作。看起來你的客戶端錯誤地發送了Accept-Encoding頭文件,或者你的服務器強制每一個對gzip的響應(內置IIS壓縮都沒有)。你可以檢查小提琴手是怎麼回事? –