2011-02-07 4 views
1

基本的に1〜2秒ごとにコードと対話するページを持つASP.NET Webアプリケーション(.NET 4.0)を設計しています(クライアントコールバックの使用ScriptManagerまたはjQuery.ajaxを使用してPageMethods)イントラネット上でホストされるため、1-2秒のリフレッシュレートは妥当なものです。超高速ASP.NET AJAXコールバック/ PageMethodsの実装方法

  1. にはどうすればページがtimeply的(例えば1秒毎)に背後にあるコードでは、Webサービス/ pagemthodにアクセスすることができます。私はjavascriptタイマーを使用すべきですか(私はjavascripに慣れていません)

  2. サイトはイントラネット上でホストされていますが、希望のリフレッシュレートに達するための良いアプローチを実装する必要があります。転送されるデータの量は、各インタラクションで約1KBです。 これに関する私のデザインに関するあなたの推奨は何ですか?

感謝を(、...任意の落とし穴は、私は避けるべきであるコールバックやのScriptManagerまたはjQuery.ajaxを使用して)

答えて

2

1〜2秒ごとに1kbの要求がどちらの方法でも妥当です。あなたが高速のネットワーク/サーバを扱っているなら、何もしないページメソッドまたはウェブサービス(彼らはほとんど同じです)は何もしません。数ミリ秒で応答します。

サーバー側のメソッドの処理に時間がかかります(つまり、データベースや外部サービスが含まれていると、サービスのオーバーヘッドよりも遅くなる可能性があります)。

+0

おかげ。サーバー側では、私はレッスンを知っています。私はそこに頑張ります。それは私が少し心配しているクライアント側です。 +あなたはページにタイマーを実装するための提案はありますか? – Kamyar

+1

JavaScriptのsetTimeoutを使用してタイマーを開始し、それぞれの応答が返ってから別のタイマーを再起動することができます。 'setTimeout(yourPollingFunction、2000)'は2秒間で 'yourPollingFunction'を呼び出します。代わりにsetIntervalを使用する誘惑を避けてください。それはいくつかの明白でない欠点を持っています:http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx –

+0

ありがとうDave。 – Kamyar

1

Webサービスは、はるかに高速であるため、私はこれを使用します。しかし、UpdatePanelsを使用している場合、Webサービスは役に立たない。私は、x秒ごとにページを更新するべきではないと言いますが、何かするための更新があれば、最初に尋ねます。これは多くを節約します;-)

これは少しの例かもしれませんが、私は試してみませんでしたが、このように一度働きました。 MSのAjaxのバージョンでは、クライアント側でのScriptManager

Type.registerNamespace("myproject"); 

myproject.updateControl = function() { 
    myproject.updateControl.initializeBase(this); 
    this._xhr = null; 
    this._updating = false; 
    this._timer = null; 
} 

myproject.updateControl.prototype = { 
    initialize: function() { 
     myproject.updateControl.callBaseMethod(this, 'initialize'); 
     this.startTimer(); 
    }, 
    startTimer: function() { 
     if (this._timer) clearTimeout(this._timer); 
     this._timer = setInterval(Function.createDelegate(this, this._timerWork), 2000); 
    }, 
    stopTimer: function() { 
     clearTimeout(this._timer); 
     this._timer = null; 
    }, 
    _timerWork: function() { 
     if (this._updating || !this._checkXhr()) return; 
     this._xhr = Sys.Net.WebServiceProxy.invoke("myServicePath Or null if PageMethod", "checkForUpdate", 
     false, 
     null, 
     Function.createDelegate(this, this._onCheckedUpdate)); 

    }, 
    _onCheckedUpdate: function (data) { 
     this._xhr = null; 
     if (data.needsUpdate) { 
      this._update(); 
     } 
    }, 
    _udpate: function() { 
     if (!this._checkXhr) return; 
     this._updating = true; 
     this._xhr = Sys.Net.WebServiceProxy.invoke("servicepath", "updateMe", false, { param: param }, Function.createDelegate(this, this._updateSucces)); 
    }, 
    _updateSuccess: function (data) { 
     alert("yeah i´m get updated"); 
     this._updating = false 
     this._xhr = null; 

    }, 
    _checkXhr: function() { 

     if (this._xhr()) { 
      if (confirm("There is an active call to the Server. If you wait to long, it may have been broken. Do you want to Abort the current call?")) { 
       this._xhr.get_executor().abort(); 
       this._xhr = null; 
       return true; 
      } else { 
       return false; 
      } 
     } 

     return true; 

    }, 
    dispose: function() { 
     myproject.updateControl.callBaseMethod(this, 'dispose'); 
    } 
} 

myproject.updateControl.registerClass('myproject.updateControl', Sys.Component); 

使用を必要とする

$create(myproject.updateControl); 

または

var upd = new myproject.updateControl(); 
upd.initialize(); 
+0

更新パネルはありません。膨大な量の不要なデータが前後に移動します。 Viewstateのように。それで私はそれを避けるのに十分です。私の第一の質問には何か提案がありますか? – Kamyar

1

"タイマー" 悪い考えです。 setInterval(method, timespan)を使用してnミリ秒ごとに呼び出しを強制できますが、サーバーがバックアップされると、スタッキング要求を開始することができます(低速でないネットワークであっても)応答が乱れるようになります。

コール処理ロジックのajaxコードでsetTimeout(method, timespan)を使用して、次のコールを設定することをお勧めします。

(jQueryの使用)例:

function getStuff() 
{ 
    $.get(
    'myurl.aspx?r=' + Math.random(), // stop caching issues 
    function(data) { 
     $('#myDiv').html(data); 
     setTimeout(getStuff, 2000); // you might want to set this to 1900 if you need it closer to every 2 seconds 
    } 
); 
} 
setTimeout(getStuff, 2000); // the initial timer initialization 
+0

Seanありがとうございます。おそらく私はこのように実装するでしょう。 – Kamyar

関連する問題