首页 > 解决方案 > 如果使用 MemoryStream 而不是 FileStream,则 HttpResponseMessage 始终为空

问题描述

我想创建一个流本地文件的 HttpResponse。我想使用 MemoryStream,以便之后可以删除文件(实际上是在返回响应之前)。尽管流似乎是有效的,但我总是得到一个空响应。不过,在 API Controller 中使用 FileStream 是可行的。

 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);不适用于内存流。

有任何想法吗?

标签: streamhttpresponseasp.net-apicontroller

解决方案


最后我找到了一个可行的解决方案:

  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");

推荐阅读