Gzip圧縮を使用したページをリクエストすると、次のエラーが多数発生します。
System.IO.InvalidDataException:GZipフッターのCRCは、解凍されたデータから計算されたCRCと一致しません
私はネイティブのGZipStreamを使用して解凍し、これに対処することを検討しています。それを念頭に置いて、この問題を適切に処理するこのまたは別のGZipライブラリ(無料?)に対処するための回避策がありますか?
WebResponse ContentEncodingがGZIPであることを確認しています
更新5/11簡略化されたスニペット
//Caller
public void SOSampleGet(string url)
{
// Initialize the WebRequest.
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = WebRequestMethods.Http.Get;
webRequest.KeepAlive = true;
webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
webRequest.Referer = WebUtil.GetDomain(url);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
using (Stream stream = GetStreamForResponse(webResponse, READTIMEOUT_CONST))
{
//use stream
}
}
//Method
private static Stream GetStreamForResponse(HttpWebResponse webResponse, int readTimeOut)
{
Stream stream;
switch (webResponse.ContentEncoding.ToUpperInvariant())
{
case "GZIP":
stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
break;
case "DEFLATE":
stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
break;
default:
stream = webResponse.GetResponseStream();
stream.ReadTimeout = readTimeOut;
break;
}
return stream;
}
.net 2以降に利用可能なwebrequest AutomaticDecompressionプロパティはどうですか?追加するだけです:
webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
また、gzip、deflateをacceptエンコードヘッダーに追加します。
http://msdn.Microsoft.com/en-us/library/system.net.httpwebrequest.automaticdecompression.aspx を参照してください
.NET Coreの場合は、もう少し複雑です。 GZipStream
には(執筆時点で)プロパティがないため、AutomaticCompression
が必要です。ここで私の答えを参照してください: https://stackoverflow.com/a/44508724/2421277
回答からのコード:
var req = WebRequest.CreateHttp(uri);
/*
* Headers
*/
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
/*
* Execute
*/
try
{
using (var resp = await req.GetResponseAsync())
{
using (var str = resp.GetResponseStream())
using (var gsr = new GZipStream(str, CompressionMode.Decompress))
using (var sr = new StreamReader(gsr))
{
string s = await sr.ReadToEndAsync();
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string respStr = sr.ReadToEnd();
int statusCode = (int)response.StatusCode;
string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
}
}
}
ストリームをフラッシュして閉じていますか? UsingステートメントでGZipStreamをラップしてみてください。
GZipでエンコードされたページのリクエスト/レスポンス全体を示すサンプルコードを見つけました。 GZipStreamを使用します。
http://www.know24.net/blog/Decompress+GZip+Deflate+HTTP+Responses.aspx
上記の私のコメントを参照してくださいが、これは通常、破損したファイルの症状です。サイトが自分のものである場合は、アクセスしようとしているファイルを置き換えます。