2011-02-07 4 views
1

기본적으로 1-2 초마다 코드와 상호 작용해야하는 페이지가있는 ASP.NET 웹 응용 프로그램 (.NET 4.0)을 디자인하고 있습니다 (클라이언트 콜백 사용 ScriptManager 또는 jQuery.ajax를 통한 PageMethods) 인트라넷에서 호스팅되므로 1-2 초의 재생 빈도가 적당합니다.초고속 ASP.NET AJAX 콜백/PageMethods 구현하는 방법

  1. 어떻게 페이지가 timeply 방식 (예를 들어 1 초) 뒤에 코드에서 웹 서비스/pagemthod에 액세스 할 수 있습니다. javascript 타이머를 사용해야합니까 (저는 javascrip에 익숙하지 않습니다).

  2. 사이트는 인트라넷에서 호스팅되었지만 원하는 재생 빈도에 도달하기 위해서는 여전히 좋은 방법을 구현해야합니다. 전송되는 데이터의 양은 각 상호 작용에서 약 1KB입니다. 이것에 관한 나의 디자인에 대한 귀하의 추천은 무엇입니까?

감사합니다 (... 어떤 함정은 내가 피해야 콜백 또는 스크립트 관리자 또는 jQuery.ajax를 사용하여).

답변

2

1 ~ 2 초마다 1kb 요청은 두 방법 중 하나를 사용하는 것이 적당합니다. 빠른 방식의 네트워크/서버를 다루는 경우 페이지 메서드 또는 웹 서비스 (거의 동일 함)는 아무 반응이 없습니다. 몇 밀리 초 만에 응답합니다.

제한 요소는 서버 측 메소드의 처리가 완료되는 데 걸리는 시간입니다 (즉, 데이터베이스 또는 외부 서비스와 관련된 경우 오버 헤드가 서비스 오버 헤드를 넘을 수 있습니다).

+0

감사합니다. 서버 측에서, 나는 나의 수업을 알고있다. 나는 최선을 다하겠습니다. 조금 걱정되는 것은 클라이언트 측입니다. + 페이지에 타이머를 구현하는 것에 대한 제안 사항이 있습니까? – Kamyar

+1

자바 스크립트의 setTimeout을 사용하여 타이머를 시작한 다음 각 응답이 돌아 오면 다른 타이머를 다시 시작하는 것이 좋습니다. 'setTimeout (yourPollingFunction, 2000)'을 호출하여'yourPollingFunction'을 2 초안에 호출합니다. 대신 setInterval을 사용하려는 유혹을 피하십시오.여기에는 몇 가지 분명한 단점이 있습니다. http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx –

+0

데이브 감사합니다. – Kamyar

1

Webservices는 훨씬 빠르기 때문에 사용합니다. 그러나 UpdatePanels로 작업하는 경우 Webservices는 쓸모가 없습니다. 나는 xs 초마다 페이지를 업데이트하지 말아야 하겠지만 처음에는 업데이트 할 것이 있는지 물어 본다. 이것은 많은 것을 저장합니다 ;-)

이것은 약간의 예일 수 있습니다. 그러나 이것은 한 번 시도해 보았지만 이렇게 한 번했습니다. 석사 아약스 버전인가, 클라이언트 측에서

$create(myproject.updateControl); 

또는

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

업데이트 패널이 없습니다. 방대한 양의 불필요한 데이터가 앞뒤로 이동합니다. Viewstate와 비슷합니다. 그것이 나를 피하는 것으로 충분합니다. 내 첫 번째 질문에 대한 제안이 있습니까? – Kamyar

1

"타이머가"나쁜 생각에 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); 

사용이 필요합니다. setInterval(method, timespan)을 사용하여 n 밀리 초마다 호출을 강제로 수행 할 수 있지만 서버가 백업되면 스태킹 요청을 시작할 수 있습니다 (응답 속도가 느린 네트워크에서도).

호 처리 로직의 아약스 코드에서 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

감사합니다 션. 아마 이런 방식으로 구현할 것입니다. – Kamyar

관련 문제