2014-05-18 2 views
1

내 응용 프로그램이 재설정 될 때마다 signalR이 연결이 끊어 지지만 다시 연결되지 않습니다.SignalR 연결이 끊어지고 다시 연결되지 않음

각 작업이 완료 될 때 클라이언트에 업데이트를 보내는 오래 실행되는 서버 작업이 있습니다. 위의 코드

// inside action executed on every completion of a task 
var h = new ForceHub(); 
h.MessageSent(email); 

는 응용 프로그램이 다시 설정됩니다 때 (내가 Web.config의를 터치하여이 문제를 에뮬레이션 할 수 있습니다) 업데이트를 전송 중지합니다.

나는 클라이언트에 다시 연결하는 방법을 원합니다. 현재 사용자는 업데이트를 다시 받으려면 페이지를 다시로드해야합니다. 여기

내가 연결다시 연결 이벤트 그러나 Web.config의 접촉 후에, 나는이 트리거 이러한 이벤트가 표시되지 않습니다, 시작 후 트리거 볼 수 있습니다 내 허브 정의

public class ForceHub : Hub 
{ 
    public void MessageSent(string text) 
    { 
     GetContext().Clients.All.sent(text); 
    } 

    public void UpdateStatus(string msg) 
    { 
     GetContext().Clients.All.status(msg); 
    } 

    IHubContext GetContext() 
    { 
     return GlobalHost.ConnectionManager.GetHubContext<ForceHub>(); 
    } 
    public override Task OnConnected() 
    { 
     try { 
      IoC.Resolve<ILogger>().Info("SignalR Connected -----------"); 
     }catch (Exception){} 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     try { 
      IoC.Resolve<ILogger>().Info("SignalR Disconnected -----------"); 
     } 
     catch (Exception) { } 
     return base.OnDisconnected(); 
    } 

    public override Task OnReconnected() 
    { 
     try { 
      IoC.Resolve<ILogger>().Info("SignalR Re-Connected -----------"); 
     } 
     catch (Exception) { } 
     return base.OnReconnected(); 
    } 
} 

입니다 .

내가 클라이언트에서이 잡기했지만,이 이벤트는 tirggered되지 않습니다

$.connection.hub.disconnected(function() { 
    console.error('signalR disconnected, retrying connection'); 
    logError('Signal lost.'); 
    setTimeout(function() { connection.start(); }, 1000); 
}); 

갱신 나는 또한 트리거됩니까 주 Changed 이벤트로 구부려

을하지만, 재를 아래의 연결 시도가 작동하지 않습니다.

 $.connection.hub.stateChanged(function (state) { 
      console.debug('signalR state changed', state); 
      if (state.newState == 1) { 
       console.debug('restarting'); 
       setTimeout(function() { $.connection.hub.start(); }, 1000); 
      } 
     }); 

이 이벤트가 두 번 트리거됩니다 : newState는 2, 다음 1

+0

희망이 도움이됩니다. 나는 장시간 실행되는 작업을 시도하지는 않았지만 GET으로 히트 할 때 코드 숨김이 모든 클라이언트에게 메시지를 보내는 간단한 추가 페이지를 사용했다. 이것은 "대역 외"작업을 시뮬레이트하고 응용 프로그램 재설정 후에도 정상적으로 작동하며 클라이언트는 정상적으로 통지를받습니다. 나는 SignalR이 연결을 느슨하게하지 않는다고 말하고 싶다. 그래서 당신은 그 사건을 보지 못한다. 어쩌면 문제가 다른 곳에서있을 수 있는가? – Wasp

+0

@Wasp web.config를 수정 해 보셨습니까? –

+0

물론, 나는 내 "직업"페이지 – Wasp

답변

0

내가 단서가있을 수 있습니다 ...의 Web.config를 터치하면 의미 AppPool을 재활용을 생산하는 새로운 작업자 프로세스는 것 새 요청에 대해 생성되고 나머지 요청이 끝날 때까지 또는 제한 시간에 도달 할 때까지 기존 프로세스가 잠시 동안 계속됩니다. 제한 시간 내에 끝나지 않은 요청은 종료됩니다. 장기 실행 작업 이전 프로세스에서 실행되는 동안

Signalr 클라이언트는 새로운 프로세스에 다시 연결되므로 장기 실행 작업에 당신이

GlobalHost.ConnectionManager.GetHubContext<ForceHub>(); 

을 할 때 당신은 실제로 "오래된"허브 잠시 동안 참조를 가져옵니다 클라이언트는 "새"허브에 연결됩니다. 그런 이유로 Wasp에서 수행 한 테스트가 진행되었습니다. 그는 새로 생성 된 작업자 프로세스에서 처리 된 신호 허브에 게시 할 새 요청을 작성했습니다.

singalr 백플레인 (https://www.asp.net/signalr/overview/performance/scaleout-in-signalr)을 구성 할 수 있지만 SQL Server (https://www.asp.net/signalr/overview/performance/scaleout-with-sql-server)를 사용하여 구성하는 것은 매우 쉽습니다. 백플레인은 두 작업자 프로세스를 연결할 수 있어야하며 클라이언트에서 알림을받을 수 있기를 바랍니다.

이것이 문제가되는 경우 새 요청에 의해 생성 된 알림은 백플레인 없이도 작동합니다. 백플레인의 진정한 목적은 신호기를 확장하는 것인데, 이것은 신호기를 웹 서버 팜에 연결하는 것입니다.

또한 IIS 내부에서 장시간 실행되는 작업을 수행하는 것이 어렵다는 점을 기억하십시오. 특히 IIS는 일반 appPool을 재생하고 요청 실행을위한 제한 시간 제한을 설정합니다.다음 게시물을 읽어 보시기를 권합니다. http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx "자신이 직접 백그라운드 작업을 작성할 수 있다고 생각한다면 잘못 이해하게 될 것입니다. 나는 당신의 기술을 함축하고 있지 않다. 나는 단지 그것이 미묘하다고 말하는 것이다. 게다가, 왜에해야합니까? "그것은 흥미로운 경우처럼 보였다, 나는 그것을 repro 수하려고하지만 난 할 수 없습니다

+0

오른쪽에 대한 소리 :) 몇 년 동안 그 코드를 만지지 않았습니다. 나는 IIS에서 장기간 실행되는 작업이 이상적이지 않다는 것에 동의합니다. 나는 실행 범위를 1-30 분으로 줄일 수 있었는데, 이것은 아직 길지만 지난 몇 년간 관리가 가능했습니다. 감사! –

관련 문제