次への方法はありますか?
クライアント上で同期的に実行される ActiveX メソッドを呼び出す必要があります。この呼び出しが完了するまでに時間がかかりすぎる場合に問題が発生するため、このメソッドが返す応答を待って終了したいのですが、ActiveX メソッド自体ではありません (これはサードパーティのコンポーネントであり、そのような機能がないため)。
もう1つの問題は、開発環境ではActiveXを使用せず、本番環境でのみ使用しているため、スレッドを10秒間保持するhttphandler(asp.netジェネリックハンドラー)への単純な同期リクエストを使用してメソッドの呼び出しをシミュレートし、次に、次のような結果を返します。
public void ProcessRequest(HttpContext context)
{
int interval = 10;
try
{
interval = int.Parse(context.Request["interval"]);
}
catch
{
}
Thread.Sleep(interval * 1000);
context.Response.Write("+OK");
}
したがって、「ActiveX メソッドを呼び出そうとしました」と言うとき、それは「サーバーに対して同期呼び出しを行ったところ、10 秒後に応答が返ってきた」という意味です。
ここに私がすでに試したことがあります
1) JavaScript はマルチスレッドに対応していないため、ダミーの URL を非同期で呼び出してみた後、(非同期で) 応答を受け取った後、ActiveX メソッドを呼び出してみました。ここでの問題は、ブラウザーがメソッドを呼び出すと、ページ全体が応答しなくなることです。コードは次のとおりです。
$.ajax({
url:'../test/ThreadSleep.ashx',
async:true,
data:{ interval: 2 },
success: function(response){
// here is the actual simulation of the ActiveX method call
$.ajax({
url:'../test/ThreadSleep.ashx',
async:false,
data:{ interval: 15 },
success: function(response){
console.log(response);
alphaActiveX.xml = getAlphaXml();
}
});
}
});
2) 2 番目の解決策は、iframe で別のページを開こうとすることでした。このページは ActiveX 呼び出しを行い、呼び出しは別のページで行われるため、メイン ページは応答性を維持する必要があります。これも機能しません。iframe ページが呼び出しを行うと、メイン ページが応答しなくなります。
ページを開く JavaScript は次のとおりです: $('').dialog({ width:300, height:200, modal:true, title:'Calling ActiveX component', buttons:[ { text:'Close', click: function(){ $(this).dialog('close') } } ], close: function(){ $(this).dialog('destroy'); } });
そして、これが準備ができたページdomで実行されるjavascriptコードです:
$(function() {
if (window.location.href.indexOf('completed=1') == -1) {
//console.log(response);
setTimeout(function() {
$.ajax({
url: 'ThreadSleep.ashx',
async: false,
data: { interval: 15 },
success: function(response) {
//console.log(response);
//alphaActiveX.xml = getAlphaXml();
window.location.href = 'iframeActiveX.aspx?completed=1'
}
});
}, 1000);
}
});
3) window.open('') でこのページを呼び出そうとしましたが、これは新しいページになるので、おそらく私のページは応答性を維持すると思いましたが、間違っていました。
4) 次のようなまったく新しいブラウザ ウィンドウでこのページを開こうとすると、同じことが起こります。
$('<div><a href="../test/iframeActiveX.aspx" target="_blank">Call the ActiveX component</a></div>').dialog({
width:300,
height:200,
modal:true,
title:'Calling ActiveX component',
buttons:[
{
text:'Close',
click:function(){
$(this).dialog('close')
}
}
],
close: function(){
$(this).dialog('destroy');
}
});
どんな助けでも大歓迎です。
ありがとう