Sab*_*007 11 c# compression gzip get request
想要解压缩从 API 获取的 GZipped 响应。尝试了下面的代码,它总是返回类似:-
\n\n\\u001f\xef\xbf\xbd\\b\\0\\0\\0\\0\\0\\0\\0\xef\xbf\xbdY]o........\n
Run Code Online (Sandbox Code Playgroud)\n\n我的代码是:
\n\n private string GetResponse(string sData, string sUrl)\n {\n try\n {\n string script = null;\n try\n {\n string urlStr = @"" + sUrl + "?param=" + sData;\n\n Uri url = new Uri(urlStr, UriKind.Absolute);\n\n HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);\n request.Method = "GET";\n request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;\n\n using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())\n using (StreamReader reader = new StreamReader(response.GetResponseStream()))\n {\n script = reader.ReadToEnd();\n } \n }\n catch (System.Net.Sockets.SocketException)\n {\n // The remote site is currently down. Try again next time. \n }\n catch (UriFormatException)\n {\n // Only valid absolute URLs are accepted \n }\n\n return script;\n }\n catch (Exception ex)\n {\n throw new Exception(ex.ToString());\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n我从许多自动解压的参考文献中找到了上述代码。但最终,它对我不起作用。为了解压缩压缩的数据,我尝试了以下功能,
\n\n private string DecompressGZIP(string compressedText)\n {\n byte[] gZipBuffer = Convert.FromBase64String(compressedText);\n using (var memoryStream = new MemoryStream())\n {\n int dataLength = BitConverter.ToInt32(gZipBuffer, 0);\n memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);\n\n var buffer = new byte[dataLength];\n\n memoryStream.Position = 0;\n using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))\n {\n gZipStream.Read(buffer, 0, buffer.Length);\n }\n\n return Encoding.UTF8.GetString(buffer);\n }\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n但是,由于以下异常,它在第一行代码本身也失败了:
\n\nSystem.FormatException: \'输入不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符或填充字符中的非法字符。\'
\n\n由于我是初学者,希望你们能指导我......提前致谢......
\nhen*_*non 17
这是负责解码 gzip 流的重要部分:
var clientHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate };
var client = new HttpClient(clientHandler);
Run Code Online (Sandbox Code Playgroud)
只需按如下方式更改我的功能,这对我来说非常有效:
private JObject PostingToPKFAndDecompress(string sData, string sUrl)
{
var jOBj = new JObject();
try
{
try
{
string urlStr = @"" + sUrl + "?param=" + sData;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlStr);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
var t = ReadFully(resStream);
var y = Decompress(t);
using (var ms = new MemoryStream(y))
using (var streamReader = new StreamReader(ms))
using (var jsonReader = new JsonTextReader(streamReader))
{
jOBj = (JObject)JToken.ReadFrom(jsonReader);
}
}
catch (System.Net.Sockets.SocketException)
{
// The remote site is currently down. Try again next time.
}
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
return jOBj;
}
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
public static byte[] Decompress(byte[] data)
{
using (var compressedStream = new MemoryStream(data))
using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (var resultStream = new MemoryStream())
{
zipStream.CopyTo(resultStream);
return resultStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14197 次 |
最近记录: |