设置会话变量导致MVC中FileContentResult呈现缓慢
本文关键字:FileContentResult 缓慢 MVC 会话 变量 设置 | 更新日期: 2023-09-27 18:10:31
我的困境是这样的。我有一个页面在MVC应用程序,通过使用ajax调用的部分视图显示搜索结果的列表。该模型是一个表示动态数据集的List<List<string>>
,即用户选择希望返回哪些列以及返回的顺序。视图所做的只是一个嵌套循环,构建出结果表。
其中一个可能返回的字段是条形码的图像,该图像正在由另一个返回FileContentResult
的方法呈现。通常情况下,这工作得很好,它是光滑的和高性能的,我没有真正注意到所有的条形码被渲染和下载,即使在一个数据集有数百行长。
当我使用HttpContext.Current.Session
设置会话变量时,问题就出现了,甚至像Session["thingy"] = "thingy";
这样简单的东西。当这种情况发生时,条形码图像的性能会受到严重影响。原本需要一秒钟才能完全加载的结果集,现在在点击搜索按钮后的10秒钟内会出现图像"弹出"。有几次图片加载失败,提示"服务器现在太忙了"
有没有人知道是什么导致了这种行为?我发现了一个笨拙的解决方案,但它涉及不必要的ajax调用和对数据库的额外访问。
所以问题是,IIS是同步处理请求时,有任何存储在会话。因此,我对条形码操作的所有调用都要等到最后一个调用完成后才能继续,因此出现了弹出式。
答案在Alexei发布的这个链接中。奇怪的是,这是最容易解决问题的答案。我为我的图像创建了一个新的控制器,并将条形码呈现操作重构到其中,然后用[SessionState(SessionStateBehavior.Disabled)]
装饰控制器,迫使IIS将对控制器中操作的任何请求视为异步处理。
我之前也有同样的问题。通过在我的web.config中设置EnableSessionState为ReadOnly来修复它。
我认为它可能有一些负面的副作用,但到目前为止还没有。甚至在SO中发布了一个问题,寻求评论。
见这里:EnableSessionState = ReadOnly -可能的副作用?