Я пытаюсь вернуть файл в ASP.NET Web API Controller. Этот файл представляет собой динамически созданный PDF-файл, сохраненный в MemoryStream.Угловой/Web API 2 возвращает недопустимый или поврежденный файл с StreamContent или ByteArrayContent
Клиент (браузер) получает файл успешно, но когда я открываю файл, я вижу, что все страницы полностью пусты.
Дело в том, что если я возьму тот же MemoryStream и напишу его в файл, этот файл будет отображаться правильно, поэтому я предполагаю, что проблема связана с передачей файлов через Интернет.
Мой контроллер выглядит следующим образом:
[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);
memStream.Position = 0;
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(memStream.ToArray()); //OR: new StreamContent(memStream);
return result;
}
Просто попробовать, если я пишу поток на диск, она отображается правильно:
[HttpGet][Route("export/pdf")]
public HttpResponseMessage ExportAsPdf()
{
MemoryStream memStream = new MemoryStream();
PdfExporter.Instance.Generate(memStream);
memStream.Position = 0;
using (var fs = new FileStream("C:\\Temp\\test.pdf", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
memStream.CopyTo(fs);
}
return null;
}
Отличия:
- PDF сохранен на диске: 34KB
- PDF, переданный через Интернет : 60KB
Если сравнивать оба файл содержимого, основные отличия (!):
Слева Ф передаются через сеть; справа, PDF сохранен на диске.
С кодом нет в коде? Возможно, что-то связано с кодировками?
Спасибо!
Вы избили меня до него. :) так близко. за вас. – Nkosi
Извините, но не повезло :(То же самое: кое-что указать: 'memStream.GetBuffer()' возвращает массив байтов размером ~ 64 Кбайт, а 'memStream.ToArray()' возвращает массив байтов ~ 34K ... – Adrian
Не использовать GetBuffer(), поскольку он возвращает массив фиксированного размера ... использовать ToArray(). –