ASP.NET - 停止/解决方法 Response.Write() 的异步行为

Posted

技术标签:

【中文标题】ASP.NET - 停止/解决方法 Response.Write() 的异步行为【英文标题】:ASP.NET - Stop/Workaround Response.Write()'s asynch behavior 【发布时间】:2011-09-03 12:22:42 【问题描述】:

我有一个通过

向用户发送 PDF 的流程
Response.BinaryWrite(pdf);

完成后,我想

Response.Redirect("Default.aspx");

问题是重定向在BinaryWrite() 完成之前触发。我知道这一点是因为我没有看到我应该下载 PDF 的弹出窗口。

如果我删除

Response.Redirect("Default.aspx");

然后我应该得到弹出窗口。所以,这里有一个竞争条件(可能与 HTTP 无连接有关)。我可以的

Thread.Sleep(5000);

但这太荒谬了。这个问题有好的解决办法吗?


我试过 AJAX。这也行不通。 Due to an issue with AJAX and popups,我必须使用解决方法
window.frames["#pdfPopup"].location.reload();

显示我的弹出窗口。

那么这段代码永远不会运行...

alert('before href');//no alert ever displays
window.location.href = "http://www.yahoo.com/";

这可能是因为我调用了 reload()。有什么想法吗?


我为框架连接了onload,但这仍然不起作用!啊。我读到 onload 不会触发包含 activeX 控件的框架,包括 PDF。我读过这个on SO 和multiple 谷歌网站。
<iframe id="pdfPopup" style="visibility:hidden;height:0px;width:0px;" onload="Redirect();"></iframe>

onload 确实会在页面加载时触发,但当我调用 reload 并将 PDF 放在那里时不会触发。所以我撞到了一堵砖墙。有人对此有任何解决方案吗?

【问题讨论】:

【参考方案1】:

不要使用document.href,而是在客户端通过window.open 打开弹出窗口,并传递URL 以在那里下载PDF。然后你可以执行重定向

window.open("PDFService.aspx?param1=...");
document.location.href = "Default.aspx";

【讨论】:

+1 @Denis Mazorick 这听起来很有希望。我不确定如何进行任何类型的线程同步,因为 Response.BinaryWrite() 在完成时不会发出信号(如果可以的话,我不会有这个问题开始)。您是否建议我编写自己的序列化程序而不是使用 BinaryWrite()?如果是这样的话,我不太清楚如何攻击它。 只需在 BinaryWrite 正下方添加线程同步代码。一定要使用锁。注意:我的建议是客户端和服务器端的组合。不仅仅是服务器端。再一次 - 您使用客户端代码重定向用户,而不是服务器端,并且仅在队列项目获得“完成”状态之后。您最终可能会从客户端多次调用服务器,直到您得到它为止。 我明白你在说什么,我过去做过很多线程同步应用程序。鉴于我的情况,我不确定如何使用锁/互斥锁来解决问题。没有什么可以锁定的。 HTTP 是一种无连接协议。 @P.Brian.Mackey - 为什么不通过客户端的 window.open 打开弹出窗口并传递 URL 以在那里下载 PDF?然后服务器端的页面将只是 BinaryWrite 数据。请务必将 ContentType 标头设置为 application/pdf。它会自动建议用户打开 PDF 或将其保存到磁盘,并自动关闭该弹出窗口。因此,您的用户不会从任何地方的页面重定向,您也不需要客户端重定向 好主意。说真的,我已经为此苦苦挣扎了几天。我尝试过 ajax、document.href、服务器端代码……这是唯一有效的方法。谢谢一百万。【参考方案2】:

您不能将Response.BinaryWriteResponse.Redirect 一起使用,因为用户代理将处理重定向的HTTP 302 响应并采取相应措施。你应该做的是使用其中一个。使用 Response.BinartyWrite(只要没有失败并且您没有手动设置响应代码)将在响应结束后返回 HTTP 200 以及内容。

【讨论】:

那么您是说不能显示弹出窗口来下载 PDF 文件,然后将用户重定向回他们的主页? 当然有可能,但是您需要客户端来处理弹出窗口的显示。可能将document.location.href 设置为PDF 下载uri,然后将document.location.href 设置为主页网址。 好的,我现在跟着你。我会尝试 AJAX。 请注意,我也尝试了您对document.location.href 的建议。这导致页面在弹出窗口出现之前重定向。所以我回到了我开始的地方。

以上是关于ASP.NET - 停止/解决方法 Response.Write() 的异步行为的主要内容,如果未能解决你的问题,请参考以下文章

如何停止 ASP.NET 回发(返回 false、e.stopPropagation、e.cancelBubble)不起作用

Visual Studio 2013 IntelliSense 停止为 ASP.NET MVC5 控制器工作

ASP.NET ChangePassword 控件停止工作

ASP.NET 5:Azure Web 应用 CORS 在延迟后停止工作

为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?

记录asp.net网站停止运行原因的代码