ASP.NET - асинхронное поведение Stop / Workaround Response.Write () - PullRequest
0 голосов
/ 27 мая 2011

У меня есть процесс, который отправляет PDF пользователю через

Response.BinaryWrite(pdf);

После этого я хочу

Response.Redirect("Default.aspx");

Проблема в том, что перенаправление срабатывает до BinaryWrite() завершено.Я знаю это, потому что я не вижу всплывающее окно для загрузки PDF, как я должен.

Если я удаляю

Response.Redirect("Default.aspx");

Тогда я получаю всплывающее окно, как и должно быть.Итак, здесь есть условие гонки (возможно, это связано с тем, что HTTP не имеет соединения).Я мог бы сделать

Thread.Sleep(5000);

Но это смешно.Есть ли хорошее решение этой проблемы?

Я попробовал AJAX.Это тоже не работает. Из-за проблемы с AJAX и всплывающими окнами я должен использовать обходной путь

window.frames["#pdfPopup"].location.reload();

, чтобы отобразить мое всплывающее окно.

Тогда этот код никогда не запускается ...

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

Это может быть потому, что я вызвал reload ().Есть идеи?

Я подключился к onload для кадра, но это все еще не работает!Тьфу.Я читал, что onload не запускается для фреймов, которые содержат элементы управления ActiveX, включая PDF.Я прочитал это на SO и нескольких сайтах Google.

<iframe id="pdfPopup" style="visibility:hidden;height:0px;width:0px;" onload="Redirect();"></iframe>

onload срабатывает при загрузке страницы, но не когда я вызываю reload и помещаю туда PDF,Итак, я ударил кирпичную стену.У кого-нибудь есть какие-нибудь решения для этого?

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Вместо использования document.href откройте всплывающее окно через window.open на стороне клиента и передайте URL, чтобы загрузить туда PDF. Затем вы можете выполнить перенаправление

window.open("PDFService.aspx?param1=...");
document.location.href = "Default.aspx";
2 голосов
/ 27 мая 2011

Вы не можете использовать Response.BinaryWrite с Response.Redirect, потому что пользовательский агент будет обрабатывать ответ HTTP 302 перенаправления и действовать соответственно.Что вы должны сделать, это использовать один или другой.Использование Response.BinartyWrite (до тех пор, пока ничего не произойдет и вы не установили код ответа вручную) вернет HTTP 200 вместе с содержимым после завершения ответа.

...