【问题标题】:ASP.NET - Stop/Workaround Response.Write()'s asynch behaviorASP.NET - 停止/解决方法 Response.Write() 的异步行为
【发布时间】: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 SOmultiple 谷歌网站。
<iframe id="pdfPopup" style="visibility:hidden;height:0px;width:0px;" onload="Redirect();"></iframe>

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

【问题讨论】:

    标签: jquery asp.net ajax race-condition


    【解决方案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 的建议。这导致页面在弹出窗口出现之前重定向。所以我回到了我开始的地方。
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多