【问题标题】:Response.WriteFile function fails and gives 504 gateway time-outResponse.WriteFile 函数失败并给出 504 网关超时
【发布时间】:2012-03-22 15:26:05
【问题描述】:

环境:
-SharePoint 2010 基础
-基于声明的身份验证
-web.config 中的执行超时设置为 3600

概述:
我们有一个 Excel 导出功能,我们可以连接到 AD 和 SQL 数据库,以获取 Active Directory 中特定组织单位 (OU) 的用户及其相关数据。 我们在 AD 中的 OU 上有大约 1400 个用户。我们正在使用 Open and Closed xml 生成 excel 文件,该文件工作正常,大约需要 11-14 分钟才能在以下路径的服务器上生成文件 C:\inetpub\wwwroot\wss\VirtualDirectories\VirtualDirectyrName\Excel\FileName.xlsx

在生成文件后,我们立即有以下代码,该代码将从服务器读取文件并将其转储到输出流中,并在浏览器中向最终用户显示文件操作保存对话框。

问题描述:
当一个组织的用户数量较少并且在服务器上生成文件的时间不超过 5-6 minteus 时,以下代码会成功地将文件下载到浏览器上。但是,当我们有 1400 个用户的上述 OU 时,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 也给出了相同的行为。

有什么想法吗?

【问题讨论】:

    标签: asp.net sharepoint-2010


    【解决方案1】:

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

    要解决此问题,请考虑两个方面。

    1. 生成此文件时,使用带有句柄的线程 ether 生成它,无需会话
    2. 从处理程序(不使用会话)而不是从回发的页面下载此文件。

    例如,您创建了一个处理程序,例如 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?

    【讨论】:

    • 我不确定我是否理解您的建议,我们在下载文件的任何地方都没有明确使用会话。您能否详细解释一下或指出一些相关链接?
    • @NikhilVaghela 当您使用页面时,该页面会为用户调用会话,并且此会话将锁定所有其余用户,直到完成。因此,当您与用户有延迟时,其他用户可能会因为等待第一个用户完成而超时。我现在将在答案上放置一些链接。
    • 感谢您的帮助。我认为您描述的问题与您所建议的不同的原因是文件的导出是从服务器内部工作的,这是我从外部环境浏览网站时的问题,显然是通过负载平衡器。跨度>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 2013-05-20
      • 2011-08-30
      • 2017-04-30
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多