epplus保存为流_c#-EPPlus无法访问封闭的流

该博客探讨了在ASP.NET MVC应用程序中使用EPPlus库导出数据到Excel时遇到的ObjectDisposedException异常。问题出现在尝试访问已关闭的MemoryStream时。通过将MemoryStream实例移出using语句可以解决问题,但可能导致内存泄漏。作者讨论了可能的内存管理影响,并提供了异常的堆栈跟踪。
摘要由CSDN通过智能技术生成

EPPlus为什么会引发System.ObjectDisposedException:无法访问封闭的Stream.写入MemoryStream并试图在ASP.NET MVC应用程序中定位零后?

public FileStreamResult ExportToExcel()

{

using (var memoryStream = new MemoryStream())

using (var excel = new ExcelPackage())

{

var worksheet = excel.Workbook.Worksheets.Add("Products");

worksheet.Cells["A1"].LoadFromCollection(Collection: myCollection, PrintHeaders: true);

excel.SaveAs(memoryStream);

memoryStream.Seek(0, SeekOrigin.Begin); // also tried memoryStream.Position = 0;

return new FileStreamResult(memoryStream, contentType)

{

FileDownloadName = "test.xlsx",

};

}

}

如果我将var memoryStream = …从using语句中移出,它可以工作,但感觉这可能会泄漏大量内存,导致较大的结果,直到下一次垃圾回收为止(如果未明确处置).也许ExcelPackage也处理MemoryStream吗?

全栈跟踪:

[ObjectDisposedException: Cannot access a closed Stream.]

System.IO.__Error.StreamIsClosed() +57

System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count) +10653946

System.Web.Mvc.FileStreamResult.WriteFile(HttpResponseBase response) +80

System.Web.Mvc.FileResult.ExecuteResult(ControllerContext context) +168

System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13

System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56

System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420

System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420

System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +52

System.Web.Mvc.Async.<>c__DisplayClass28.b__19() +173

System.Web.Mvc.Async.<>c__DisplayClass1e.b__1b(IAsyncResult asyncResult) +100

System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10

System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49

System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27

System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13

System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36

System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54

System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39

System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult, Controller controller) +12

System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +28

System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54

System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29

System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10

System.Web.Mvc.MvcHandler.b__4(IAsyncResult asyncResult, ProcessRequestState innerState) +21

System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36

System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54

System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31

System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9

System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296

System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值