Response.WriteFile函数失败并给出504网关超时

时间:2012-03-15 07:57:18

标签: asp.net sharepoint-2010

环境:
-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也提供相同的行为。

任何想法?

2 个答案:

答案 0 :(得分:0)

我怀疑这里是你感觉会话锁定。我的意思是下载和生成以及使用会话进行的所有调用,会话锁定所有内容直到完成。

要解决这个问题,请两个人思考。

  1. 当您生成此文件时,使用带有句柄的线程以太网生成以太
  2. 从处理程序(不使用会话)下载此文件,而不是从页面发回。
  3. 例如,您创建了一个处理程序,例如 download.ashx ,并在download.ashx?thisfileId=7723423&SecurityID=82jkj1288123处创建指向您页面的链接。在处理程序中,您可以读取此参数并发送文件。但是如果您在页面上进行此操作,那么如果您不使用会话,则可以禁用此页面的会话,例如您在第一行声明上设置EnableSessionState="false"

    一些类似的问题和会话相关答案。

    call aspx page to return an image randomly slow

    Replacing ASP.Net's session entirely

    How to deliver big files in ASP.NET Response?

答案 1 :(得分:0)

我发现了问题,这是我们使用的硬件负载均衡器中的空闲超时问题。负载均衡器中的默认值为0表示11分钟,我的文件生成时间比导致此问题的时间长。增加负载均衡器空闲时间问题似乎是解决方案。