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.BinaryWrite
与Response.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 5:Azure Web 应用 CORS 在延迟后停止工作