HttpResponseMessage всегда пуст, если используется MemoryStream вместо FileStream - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу создать HttpResponse для потоковой передачи локального файла. Я хочу использовать MemoryStream, чтобы впоследствии я мог удалить файл (ну, на самом деле, прежде чем вернуть ответ). Я всегда получаю пустой ответ, хотя поток кажется действительным. Работа с FileStream в API Controller работает, хотя.

 public HttpResponseMessage GetExcelFile(Guid id)
        {
            // this model is needed to internally create an .xls file that represents this model
            var exportModel = this.myService.GetExport(id);

            // this approach does not work -> respone always empty although memory stream has content
            // var stream = new MemoryStream();
            // internally creates a .xls file (using lib) and returns its content as memory stream
            // this.myService.ConvertToStream(exportModel, stream));

            // this works fine
            var stream = File.OpenRead(@"D:\test0815.xls");

            var result = this.Request.CreateResponse(HttpStatusCode.OK);

            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = stream.Length;
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                                                            {
                                                                FileName = $"{exportModel.Name}-Sheet.xls"
                                                            };

            return result;
        }

это мой метод, который фактически конвертирует в поток памяти:

 private MemoryStream SaveToStream(MemoryStream stream)
        {
            using (FileStream source = File.Open(
                @"D:\test0815.xls",
                FileMode.Open))
            {
                Console.WriteLine("Source length: {0}", source.Length.ToString());

                // Copy source to destination.

                source.CopyTo(stream);
            }

            return stream;
        }

Я также пытался записать в поток памяти, но это тоже не сработало. Кажется, что result.Content = new StreamContent(stream); просто не работает с потоком памяти.

Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2019

наконец-то я нашел рабочее решение:

  var memoryStream = new MemoryStream((int)fileStream.Length);
            fileStream.CopyTo(memoryStream);
            fileStream.Close();
            memoryStream.Seek(0, SeekOrigin.Begin);

            HttpContent content = new StreamContent(memoryStream);

            var result = this.Request.CreateResponse(HttpStatusCode.OK);
            result.Content =content;
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...