2017-09-28 1 views
1

많은 작업자 프로세스를 관리하는 허브가 있습니다. 이 허브에 연결하고 이러한 작업자 프로세스 중 하나에서 처리 로그를 검색 할 수있는 UI를 작성하려고합니다. 본질적으로 이것은 다른 클라이언트로부터 문자열을 얻고 자하는 클라이언트가 될 것입니다. 나는 클라이언트 B에게 보낸 클라이언트 A로부터 요청을받을 수 있었지만 그 응답에서 무엇을 반환 할 지 모릅니다. C# SignalR 클라이언트에서 값을 반환하는 방법

나는이 요청은 클라이언트에 의해 선택됩니다 허브

public void GetRunLog(int runid) 
{ 
    JobRunLog log = null; 
    JobRunClient client = this.GetClientByRunID(runid); 
    if(client != null) 
    { 
     var rawlog = Clients.Client(client.ConnectionID).GetRunLog(); 
     log = JsonConvert.DeserializeObject<JobRunLog>(rawlog); 
     Clients.Client(Context.ConnectionId).GetRunLog(log); 
    } 
} 

에 간단한 방법을 가지고,하지만 난 그것을 var rawlog 실제로 뭔가를 포함하고 그래서 값을 반환하는 방법을 잘 모릅니다. 잠시 동안, 이것이 내가 생각해 낼 수있는 최선의 해결 방법입니다.

myHubProxy.On("GetRunLog", (uiconnectionid) => 
{ 
    string connectionid = uiconnectionid; 
    myHubProxy.Invoke("ReturnRunLog", run.ID, run.Log, connectionid).ContinueWith(task => {}); 
}); 

는 작업자 클라이언트가 로그를 요청했다 클라이언트에 대한 참조를 사용하여 별도의 요청에 다시 로그를 보내 게되지만, 실제로는 초기 요청에 respnonse을 반환 밤은. 나는이 일이 일어날 수있는 길을 볼 수 없다. Invoke를 사용하는 대신 요청을 시작한 허브의 메서드로 개체를 직접 반환하는 방법은 무엇입니까?

답변

1

Unfortunatelly 허브 doesn't keeps it's state는 : 허브 클래스의 인스턴스가 과도하기 때문에

, 당신은 그들이 다음 하나의 메소드 호출에서 상태를 유지 관리하는 데 사용할 수 없습니다. 서버가 클라이언트로부터 메서드 호출을받을 때마다 Hub 클래스의 새 인스턴스가 메시지를 처리합니다. 여러 개의 연결 및 메서드 호출을 통해 상태를 유지하려면 데이터베이스 또는 Hub 클래스의 정적 변수 또는 허브에서 파생되지 않은 다른 클래스 과 같은 다른 메서드를 사용하십시오.

논리를 별도의 클래스로 이동하고 연결 개체와 관련된 정적 사전에 인스턴스 개체를 저장하십시오 (정리하는 것을 잊지 마세요). 통화가 허브에 관해서 Whenewer 그것이 적절한 인스턴스에 다시 지정해,
여기 는 인스턴스가 몇 가지 작업을하고있어 시작되는 단순화 된 샘플 그래서

public class TestingLogHub : Hub 
{ 
    public static readonly Dictionary<string, TestInstance> Instances = 
         new Dictionary<string, TestInstance>(); 

    public void SetParameter(string value) 
    { 
     Instances[Context.ConnectionId].ContinueWith(value); 
    } 
    ... 
} 

public class TestInstance : IDisposable 
{ 
    public TestInstance(string basePath, IHubContext host, string connectionId) 
    {... 
    } 
    public void ContinueWith(string value) 
    { 
     if (_nextAction == null) 
     { 
      FinishExecution(); 
     } 
     else 
     { 
      try 
      { 
       _nextAction(value); 
      } 
      catch (Exception exception) 
      { 
       Error(exception.Message); 
       FinishExecution(); 
      } 
     } 
    } 


    public void RequestParameterFor(Action<string> action, string parameter, string defaultValue = null) 
    { 
     _nextAction = action; 
     _host.Clients.Client(_connectionId).requestParameter(parameter, defaultValue??GetRandomText()); 
    } 
} 

하지만 순간에 그것이 RequestParameterFor을 실행하는 몇 가지 입력을 요구하는 set은 인스턴스 상태로 실행될 다음 함수를 호출하고 ContinueWith의 다음 호출을 기다립니다. 그 유일한 필수 전화

+0

이 있다면

이 조금 일반적인 예는, 해당 요청의 끝에서 인스턴스를 처리 어쩌면 귀하의 경우는 객체를 다시 보낼 수 있으며, 인스턴스에 제공하고, 나는 일터에서 주변을 돌고있는 곳입니다. 나는 그때 서버가 단지 var 응답 = Clients.Client (conid) .somefunction()을 가짐으로써 클라이언트로부터 간단한 응답을 얻을 수있는 방법이 없다고 가정하고있다. –

+0

네, 맞습니다. [한 메소드 호출에서 다음 메소드 호출로 상태를 유지하는 데 사용할 수 없습니다.] (https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to- the-api/hubs-api-guide-server # hubclass) – ASpirin

관련 문제