Я получаю строковый результат из веб-службы и анализирую его с помощью следующего кода:
public static T FromXmlString<T>(string xml)
{
T xmlClass = default(T);
using (TextReader reader = new StringReader(xml))
{
try
{
xmlClass =
(T)new XmlSerializer(typeof(T)).Deserialize(reader);
}
catch (InvalidOperationException e)
{
//
}
}
return xmlClass;
}
В результате получается сжатая строка, после разбора я пытаюсь распаковать ее с помощью следующего кода
byte[] bytes = Convert.FromBase64String(voucher.Document.Value);
using (var compressedStream = new MemoryStream(bytes))
using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (var resultStream = new MemoryStream())
{
zipStream.CopyTo(resultStream);
return File(resultStream.ToArray(), "application/pdf", "voucher.pdf");
}
Но я терплю неудачу каждый раз. Выдает следующую ошибку: "Магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip".
Я знаю, что есть много вопросов, подобных этому. Я попробовал все ответы в следующих ссылках:
Строка сжатия/декомпрессии с С#
Ошибка распаковки gzipstream - неверное магическое число в заголовке GZip
Но не получил никакого результата. Так, ребята, у вас есть идея, почему я получаю эту ошибку. Что не так с моим кодом?
Заранее спасибо!
Я обнаружил проблему. Изучив больше, я нашел это:
Почему мой С# gzip создает файл большего размера, чем Fiddler или PHP?
И я использовал Ionic.Zlib libray. С помощью этого я могу распаковать и получить оригинальный файл без каких-либо проблем.
Вот мой фрагмент кода:
byte[] bytes = Convert.FromBase64String(voucher.Document.Value);
var zippedStream = new MemoryStream(bytes);
var decompressed = new MemoryStream();
zOut = new ZlibStream(decompressed, Ionic.Zlib.CompressionMode.Decompress,
true);
CopyStream(zippedStream, zOut);
byte[] byteArray = decompressed.ToArray();
return File(byteArray, "application/pdf", "voucher.pdf");
Функция CopyStream:
static void CopyStream(System.IO.Stream src, System.IO.Stream dest)
{
byte[] buffer = new byte[1024];
int len;
while ((len = src.Read(buffer, 0, buffer.Length)) > 0)
dest.Write(buffer, 0, len);
dest.Flush();
}