実行時間の長い Web サービスを呼び出すページに対して Ajax 呼び出し (XMLHttpRequest) を行うクライアント側のクリック イベントを持つ ASP.net Web フォーム アプリケーションがあります。
流れは次のようになります。
Page1.aspx が Page2.aspx を呼び出すリンクをクリックする
Page2.aspx はデリゲートと IAsyncResult を使用して WebService.asmx を呼び出します。
WebService.asmx は、拡張された BackgroundWorker を使用して別のスレッドで作業を行います
IAsyncResult は BeginInvoke() を呼び出し、次に EndInvoke() を呼び出します。
問題: Page1.aspx のリンクをクリックすると、最初は問題なく動作します。ページ 1 がページ 2 を呼び出し、ページ 2 が Web サービスを呼び出すと、作業が完了します。
(WebService の作業が完了した後で) リンクをもう一度クリックすると、Page2.aspx が呼び出すはずの作業が開始されません。
デバッグすると、Page1.aspx から XMLHttpRequest.send() 要求が呼び出されたことを示す Javascript アラートが表示されます。ただし、デバッガーは Page2.aspx ページに移動しません...実際、どこにも移動しません。
以下は、私の Ajax 関数の内部です: var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", "Page2.aspx?SomeQueryString=" + someID, true);
xmlhttp.send();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
try {
var responseText = xmlhttp.responseText;
document.getElementById("_lblExportStatus").innerHTML = responseText;
}
catch (e) {
alert("Error: " + e.Message);
}
}
}
return false;
編集 XMLHttpRequest オブジェクトに別のクエリ文字列を渡すと、作業が行われることがわかりました。問題は、Open() メソッドでまったく同じ文字列を渡すことです。open() メソッドに異なる文字列を送信すると、問題なく動作します。