Это было намного сложнее, чем я думал.Основная проблема заключается в открытии нового окна браузера для документа Word.Окно кратковременно всплывает, затем закрывается - документ Word не появляется.Кажется, это проблема безопасности.
Если я нажму кнопку на своей странице, я смогу отправить документ Word обратно в ответ, и появится диалоговое окно браузера, позволяющее мне открыть / сохранить / отменить, ноКонечно, моя страница не обновляется.
Мое окончательное решение для этого было использовать клиентский скрипт на нажатие кнопки, чтобы временно установить цель формы _blank.Это заставляет ответ на щелчок по обратной передаче перейти в новое окно браузера (которое автоматически закрывается после закрытия диалога загрузки):
<asp:Button Text="Generate Doc" runat="server" ID="btnGenerateDoc"
onclick="btnGenerateDoc_Click" OnClientClick="SetupPageRefresh()" />
Моя функция SetupPageRefresh выглядит следующим образом:
function SetupPageRefresh() {
// Force the button to open a new browser window.
form1.target = '_blank';
// Immediately reset the form's target back to this page, and setup a poll
// to the server to wait until the document has been generated.
setTimeout("OnTimeout();", 1);
}
Затем моя функция OnTimeout сбрасывает цель для формы, а затем начинает опрос веб-службы, чтобы дождаться завершения процесса на сервере.(У меня есть счетчик в моем сеансе, который я обновляю после завершения процесса.)
function OnTimeout() {
// Reset the form's target back to this page (from _blank).
form1.target = '_self';
// Poll for a change.
Poll();
}
И функция Poll просто использует функцию jjuery ajax для опроса моего веб-сервиса:
function Poll() {
var currentCount = $("#hidCount").val();
$.ajax({
url: "/WebService1.asmx/CheckCount",
data: JSON.stringify({ currentCount: currentCount }),
success: function (data) {
var changed = data.d;
if (changed) {
// Change recorded, so refresh the page.
window.location = window.location;
}
else {
// No change - check again in 1 second.
setTimeout("Poll();", 1000);
}
}
});
}
Таким образом, это делает 1-секундный опрос моего веб-сервиса, ожидая, когда счетчик сеанса изменится со значения в скрытом поле на странице.Это означает, что не имеет значения, сколько времени серверный процесс генерирует документ Word (и обновляет базу данных и т. Д.), Страница не будет обновляться, пока не будет завершено.
Когда вызов веб-службы возвращаетсяпри значении true страница обновляется с помощью оператора window.location = window.location.
Для полноты, мой веб-сервис выглядит следующим образом:
/// <summary>
/// Summary description for WebService1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class WebService1 : WebService
{
[WebMethod(EnableSession=true)]
public bool CheckCount(int currentCount)
{
if (Session["Count"] == null)
Session["Count"] = 0;
var count = (int)Session["Count"];
var changed = count != currentCount;
return changed;
}
}
Надеюсь, это поможет кому-то еще!