2017-09-29 1 views
1

잠재적으로 여기에 중복 스레드를 만드는 것은 유감 스럽지만 발견 한 다른 예제를 따라 가면서 필요한 것을 수행하기 위해 웹 애플리케이션을 얻을 수 없습니다. 이상적인 솔루션
는 데이터베이스에서 데이터를 가져 오기 및 데이터에 변경이 만 웹 페이지의 UI를 업데이트 표시되는 -SignalR을 사용하여 클라이언트에 데이터 푸시

옵션 1 :

내 목표는 다음 중 하나를 수행하는 것입니다 웹 페이지에. 예를 들어 사용자가 서비스 티켓을보고있는 경우 티켓을 변경하지 않는 한 해당 페이지의 UI를 업데이트하고 싶지 않습니다.

옵션 2 - 허용 가능한 해결책
데이터베이스에서 모든 x 초를 데이터 가져 오기 및 데이터는 웹 페이지의 UI를 업데이트 할 것을 사용합니다.

내 현재 구현 옵션 2은 다음과 같습니다. 그것은 데이터를 가져 오기 위해 60 초마다 비동기 HTTP 요청을 전송 포함 :

// start checking for new messages every 60 seconds 
setInterval(function() { 
    $.ajax({ 
     async: true, 
     type: "POST", 
     contentType: "application/json; charset=utf-8;", 
     url: "/AJAX_Handlers/CheckForNewMessages.ashx", 
     dataType: "json", 
     success: function (Result) { 
      var new_message_received = Result[0]["NewMessageReceived"]; 

      if (new_message_received) { 
       $("#DIVMessageReminder").html("<strong>You have " + num_new_messages + " new message(s).</strong>"); 
       $("#DIVMessageReminder").show(); 
      } 
      else { 
       $("#DIVMessageReminder").hide(); 
      } 
     } 
    }); 
}, 60000); 

오히려 HTTP 요청을 60 초마다 보내는 것보다, 내가 클라이언트에 60 초마다 데이터를 밀어 SignalR을 사용하고 싶습니다.

Imports Microsoft.AspNet.SignalR 

Public Class ServerTimeHub 
    Inherits Hub 

    Public Sub GetServerTime() 
     Dim current_time As String = Now.ToString() 
     Clients.All.updateTime(current_time) 
    End Sub 

End Class 

그리고 기본 텍스트 상자 :

<input id="TXTLongPollingTest" type="text" class="form-control" /> 

그리고 내 클라이언트 -

간단한 예를 들어, 내가 서버에 현재 시간을 얻을 수있는 방법으로 다음과 같은 허브를 만들었습니다 사이드 코드 :

var hub = $.connection.serverTimeHub; 

hub.client.updateTime = function (new_time) { 
    $("#TXTLongPollingTest").val(new_time); 
} 

$.connection.hub.start().done(function() { 
    alert("connected to the SignalR hub"); 
    hub.getServerTime(); 
}).fail(function (err) { 
    alert("failed to connect to SignalR hub: " + err); 
}); 

처음에는 서버 시간을 한 번만 가져 오려고했습니다. 내 코드가 허브에 성공적으로 연결되지만 "Uncaught TypeError : hub.getServerTime이 함수가 아닙니다."라는 오류가 발생합니다. 그것이 내가 극복 할 수 없었던 첫 번째 문제입니다.

두 번째 문제는 다음과 같습니다. 허브가 매시간과 같이 일정한 간격으로 클라이언트에 현재 시간을 보내도록하려면 어떻게해야합니까?

답변

0

다음과 비슷한 점을 달성했습니다. 기본적으로 데이터베이스에서 데이터를 가져 와서 30 초마다 클라이언트에 브로드 캐스팅합니다. 나는 설정된 타이머가 내 GetTeamData.cs에서

protected void Application_Start(object sender, EventArgs e) 
{ 
    GetTeamData.TeamDataRepeater(); 
} 

을 : 나는 내 웹 사이트가 시작 될 때마다 확인이가 내 global.asax.cs에서

은/내 중계기 킥오프 것 다시 시작 클라이언트에 대한 30 초마다에게

public class GetTeamData 
    {  
    static Timer TeamDataTimer = new Timer(); 

    public static void TeamDataRepeater() 
    { 
      TeamDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent_TeamDataBroadcaster); 
      TeamDataTimer.Interval = 30000; //30 Seconds 
      TeamDataTimer.Start(); 
    } 

    public static void OnTimedEvent_TeamDataBroadcaster(Object sender, ElapsedEventArgs e) 
    { 
      updateFirstRow(); 
    } 

    public static void updateFirstRow() 
    { 
      IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<MsgHub>(); 
      hubContext.Clients.All.pushMyData(mydata1, mydata2, mydata3); 
    }   

    } 

내 자바 스크립트를 실행하려면이 있습니다

//I have already started my connection 

$(function() { 
    var chat = $.connection.msgHub; 
    chat.client.pushMyData = function (mydata1, mydata2, mydata3) 
    { 
    //Do something with the returned data now 
    } 
}); 

참고 그쪽으로 t 예를 들기 위해 try/catch를 사용하는 것과 같은 것을 제거했습니다.

희망이 있습니다.

+0

다른 모든 예제와 매우 비슷하게 보일지라도, 이것이 저에게 효과적입니다. 도와 주셔서 정말 감사합니다! 문제가되는 데이터가 변경된 경우에만 새 데이터를 가져 오는 솔루션이 있는지를 알고 싶습니다. – freegem

관련 문제