HttpResponseMessage всегда пуст, если используется MemoryStream вместо FileStream

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

 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); просто не работает с потоком памяти.

Любые идеи?


person yBother    schedule 11.04.2019    source источник


Ответы (1)


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

  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");
person yBother    schedule 07.05.2019