文件下载后如何修复冻结页面?(TreeView SelectedNodeChanged中的TransmitFile)

Posted

技术标签:

【中文标题】文件下载后如何修复冻结页面?(TreeView SelectedNodeChanged中的TransmitFile)【英文标题】:How to fix freezing page after file download?(TransmitFile in TreeView SelectedNodeChanged) 【发布时间】:2017-03-08 12:52:41 【问题描述】:

所以我知道这是一个常见问题,页面冻结(任何按钮在视觉上都是可点击的,但不执行任何操作),因为它在文件下载后不会关闭某些请求。

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "text/txt";
response.AddHeader("Content-Disposition", "attachment; filename=" + TreeView1.SelectedNode.Text + ";");
response.TransmitFile(TreeView1.SelectedNode.Value);
response.Flush();
response.Close();
HttpContext.Current.ApplicationInstance.CompleteRequest();

此代码在 TreeView SelectedNodeChanged 事件中,这是一个问题。

例如,如果将传输代码放在某个按钮中,我可以通过在按钮上添加 OnClientClick="javascript:setFormSubmitToFalse()" 来修复页面冻结问题,这个小 JavaScript 修复了下载后页面冻结问题。

<script type="text/javascript">
    //Fix page freeze after download dialog
    function setFormSubmitToFalse() 
        setTimeout(function ()  _spFormOnSubmitCalled = false; , 3000);
        return true;
    
</script>

但如果我单击 TreeView 节点,我不知道如何解决此问题。 TreeView 没有OnClientClick,我也尝试在传输代码Page.ClientScript.RegisterStartupScript(this.GetType(), "CallMyFunction", "setFormSubmitToFalse()", true); 之前和之后从后面的代码运行该JS 函数,但它没有帮助,文件下载后页面仍然冻结。

有什么想法可以解决这个问题吗?谢谢。

这是 sharepoint 网站上的 webpart(几乎是 asp.net 页面)。

编辑:

我将尝试更好地解释我的情况以及我想要实现的目标。

所以我的主要目标:在本地网络中有一个包含文档的共享文件夹,将使用此应用程序的用户不应访问此共享文件夹,只有运行应用程序池的实体才能访问它。

我正在发出一些 SQL 请求,它为我提供了一些子文件夹的路径。我正在构建该子文件夹的树视图,当用户单击树视图 SelectedNodeChanged 事件镜头中的某个文件时,我将文件作为应用程序池标识执行传输

SPSecurity.RunWithElevatedPrivileges(delegate()
   
   /* transmit file code */
   ); 

一切正常,但如果我理解正确的话,CLIENT 端的某些东西可能会在 TransmitFile 拍摄后冻结页面并阻止向服务器发送任何其他发布请求,这就是为什么我的小 JS 解决方案在执行 OnClientClick 时有效。

这是该修复程序的作者如何解释的原始内容,但我不知道如何将其实现到树视图 https://***.com/a/17186011/5805492

【问题讨论】:

也许这个page 或this 对你有帮助。 【参考方案1】:

所以解决方案非常简单,但有点棘手。

Nodes 没有 onClientClick 事件,但是我们可以给任何页面元素添加 JS 点击事件,对吧?所以这里是诀窍,在创建 TreeView 时,只需在 Span 的帮助下将点击添加到节点的实际文本:

...
TreeNode fileNode = new TreeNode
 
     //before
     //Text = file.Name,
     //after
     Text = "<span onclick=\"javascript:setFormSubmitToFalse();\">"+file.Name+"</span>",
     Value = file.FullName,
 ;
...

并在传输文件时将节点的文本解析为正常的文件名:

response.AddHeader("Content-Disposition", "attachment; filename=" + 
    TreeView1.SelectedNode.Text.Replace("<span onclick=\"javascript:setFormSubmitToFalse();\">", string.Empty).Replace("</span>", string.Empty) + ";");

现在一切正常,下载后页面不再冻结。

【讨论】:

【参考方案2】:

我不确定我是否真的了解您的情况,但由于 UI 线程挂在您尝试同步运行的代码上,您的应用可能会被冻结。

为了防止这种情况发生,您需要异步运行逻辑。

public async void OnSelectedNodeChanged(object sender, EventArgs e)

    await Task.Run(() => 
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/txt";
        response.AddHeader("Content-Disposition", "attachment; filename=" + TreeView1.SelectedNode.Text + ";");
        response.TransmitFile(TreeView1.SelectedNode.Value);
        response.Flush();
        response.Close();
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    ).ConfigureAwait(false);

这是一个异步 void 方法,这意味着触发此事件的代码不会等待它完成,也不会知道何时完成完成了。

这将防止线程锁定您的 UI,但如果用户能够通过单击您的 UI 周围的所有区域来“快速触发”这些事件,则可能不希望以这种方式编写代码。

无论如何,您可能需要一些形式的异步逻辑来完成您想要的。

【讨论】:

不幸的是我无法使用异步,因为我在 VS 2010 上。我看到有一些选项可以下载 microsoft.com/en-us/download/details.aspx?id=9983 但我不确定它是否可以使用我什么时候部署我的解决方案。

以上是关于文件下载后如何修复冻结页面?(TreeView SelectedNodeChanged中的TransmitFile)的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误

在使用CefSharp处理身份验证请求时,如何在关闭时修复无限对话循环

treeview 节点的属性NavigateUrl如何带参跳转并跳转到指定页面?

如何修复我的活动指示器不出现/冻结?

如何冻结窗格/修复网站标题和水平导航栏?

如何在 django 中修复冻结的 cv2.imshow(来自 opencv)