これは私が思ったよりも難しいことでした。主な問題は、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関数はフォームのターゲットをリセットし、サーバープロセスが完了するまで待つようにWebサービスのポーリングを開始します。 (私は、プロセスが完了すると、私は更新私のセッションでカウンターを持っています。)
function OnTimeout() {
// Reset the form's target back to this page (from _blank).
form1.target = '_self';
// Poll for a change.
Poll();
}
そして、ポーリング機能は、単に自分のWebサービスをポーリングするためにjQueryの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);
}
}
});
}
だから、これはありませんセッションのカウンタがページ上の非表示フィールドの値から変更されるのを待っている、Webサービスへの1秒間のポーリング。これは、サーバープロセスがWord文書の生成(およびデータベースの更新など)にどれくらいの時間を要しても、ページは完了するまで更新されません。
trueを返してWebサービスコールが戻った場合、ページはwindow.location = window.location文でリフレッシュされます。完全のために
、私のWebサービスは、次のようになります
/// <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;
}
}
うまくいけば他の誰かを助けること!