环境:
-SharePoint 2010基金会
- 基于通用的认证
- web.config中的执行超时设置为3600
概述:
我们有一个excel导出功能,我们连接到AD和SQL数据库,以便为Active Directory中的特定组织单位(OU)获取用户及其相关数据。
我们在AD的OU上有大约1400个用户。我们正在使用Open和Closed xml来生成excel文件,该文件工作正常并且需要大约11-14分钟才能在以下路径上的服务器上生成文件
C:\的Inetpub \ wwwroot的\ WSS \ VirtualDirectories \ VirtualDirectyrName \ EXCEL \ FileName.xlsx
生成文件后,我们会立即执行以下代码,这些代码将从服务器读取文件并将其转储到输出流上,并在浏览器中向最终用户显示文件ope-save作为对话框。
问题描述:
当组织的用户数量较少且在服务器上生成文件所需的时间不超过5-6分钟时,以下代码片段会在浏览器上成功下载该文件。但是,对于上面提到的OU,我们有1400个用户,reponse.writefile函数失败,在浏览中我们看到'浏览无法显示此网页'(当fiddler打开时,我们发现它给出了 - http 504错误)。值得注意的是,如果我们从服务器本身执行此导出(即浏览服务器上的网站),它会毫无问题地下载。
protected void lnkbtnDownloadFile_Click(object sender, EventArgs e)
{
String fileName = @"C:\inetpub\wwwroot\wss\VirtualDirectories\VirtualDirectyrName\Excel\540KBFileWhichFails.xlsx";
//File size is hardly ~500 KB
//Wait for around 12 minutes, to mimic a scenario of file generation which takes time on staging and prod. environment.
System.Threading.Thread.Sleep(720000);
try
{
if (fileName != "")
{
var file = new FileInfo(fileName);
if (file.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();
}
else
Response.Write("This file does not exist.");
}
}
catch (Exception ex)
{
//This would usually give thread aboart exception but thats expected.
}
}
我们在ULS日志中没有看到任何错误,特定于此行为的事件日志。 请注意,response.TransmitFile也提供相同的行为。
任何想法?
答案 0 :(得分:0)
我怀疑这里是你感觉会话锁定。我的意思是下载和生成以及使用会话进行的所有调用,会话锁定所有内容直到完成。
要解决这个问题,请两个人思考。
例如,您创建了一个处理程序,例如 download.ashx ,并在download.ashx?thisfileId=7723423&SecurityID=82jkj1288123
处创建指向您页面的链接。在处理程序中,您可以读取此参数并发送文件。但是如果您在页面上进行此操作,那么如果您不使用会话,则可以禁用此页面的会话,例如您在第一行声明上设置EnableSessionState="false"
。
一些类似的问题和会话相关答案。
call aspx page to return an image randomly slow
答案 1 :(得分:0)
我发现了问题,这是我们使用的硬件负载均衡器中的空闲超时问题。负载均衡器中的默认值为0表示11分钟,我的文件生成时间比导致此问题的时间长。增加负载均衡器空闲时间问题似乎是解决方案。