2

signalR 버전 2.1.2를 사용하고 있습니다. 그리고 나는 SignalRClient로서 콘솔 어플리케이션을 사용하고 있습니다. 메소드 A를 호출하고 응답을 얻은 후에 메소드 A의 응답을 기반으로 메소드 B를 호출해야합니다. 이 시나리오에서는 메서드 B에서 응답을받지 못하고 성공적으로 호출 할 수 있습니다. 내 실수는 뭐니?. 여기 내 코드클라이언트 메서드 내에서 signalR 메서드 호출

var hubConnection = new HubConnection("Url"); 

IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy"); 
proxy.On<bool>("Client-method-B", (retvAl) => 
{ 
    Console.WriteLine("Method-B response"); 
}); 

proxy.On<bool>("Client-method-A", (isConnected) => 
{ 
    Console.WriteLine("Method-A response"); 
    if(isConnected) 
    { 
     proxy.Invoke("method-B", "someValue").Wait(); 
    } 
}); 

hubConnection.Start().Wait(); 
proxy.Invoke("method-A", "123").Wait(); 

여기서 'method-B'의 응답이 없습니다. 감사. 코드에서

+0

허브 코드를 게시해야합니다. 거기에 문제가있을 수 있습니다. – crackhaus

답변

2

SignalR 서버 메소드의 결과를 얻는 가장 좋은 방법은 호출자 측에서 클라이언트 메소드를 호출하는 대신 리턴 값을 읽는 것입니다. 예를 들어, 다음과 같이 방법-A의 응답을 읽을 수 있습니다 :

public bool method-A(string p); 

당신이 호출하지 않아도이 방법 : 방법-A의 서명을 기대

proxy.Invoke("method-A", "123").ContinueWith((t) => 
{ 
    bool isConnected = t.Result; 
}); 

은 같은 것입니다 서버 메소드의 결과를 호출자에게 리턴하는 클라이언트 메소드. 이 같은 다른 서버 메소드 호출의 콜백에서 다른 서버 메소드를 호출 할 수 있습니다

proxy.Invoke("method-A", "123").ContinueWith((t) => 
{ 
    bool isConnected = t.Result; 
    if(isConnected) 
    { 
    proxy.Invoke("method-B", "someValue").ContinueWith((u) => 
    { 
     Console.WriteLine("Method-B response: " + u.Result); 
    }); 
    } 
}); 

는 방법-B는 서버 측에서 문자열 값을 반환하는 것으로 가정합니다.

+0

고마워요 @ XmindZ 잘 작동합니다 ............ :) 그리고 또 하나의 포인트 wait() 메소드를 호출하여 결과를 수신해야합니다 ... > proxy.Invoke ("method- B ","someValue ") ContinueWith ((u) => {Console.WriteLine ("Method-B 응답 : "+ u.Result);}) wait(); 그런 다음 메서드 호출에서 결과 만받을 수 있습니다 - – Suresh

2

는 프록시

IHubProxy proxy = hubConnection.CreateHubProxy("HitProxy"); 

하지만 나중에 u는 그래서 그냥 유형 및 프록시 == hubProxy입니다

hubProxy.Invoke("method-B", "someValue").Wait(); 

를 사용을 만들 공급?

서버가 제대로 작동을 호출하는 경우 방법 B에게

  • 체크 서버 측을 호출 할 때 실제 트래픽이 서버에있는 경우 내가 확인하는 3 가지

    1. 사용 와이어 샤크를 할 행해져 Yout 조언을 것
    2. 작업 B를 호출하여 콜백 컨텍스트에서 호출하지 않도록 할 수 있습니다. 응용 프로그램에 따라 Dispatcher 또는 Task.Run 만 사용할 수 있습니다. 나는 signalr 클라이언트에 대해 확신하지 못한다. 그러나 콜백에서 메소드를 호출 할 때 어떤 프레임 워크는 마음에 들지 않는다.
  • +0

    안녕 Lukasz 나는 나의 질문을 편집했다. 방금 현재 스레드를 전달하여 Dispatch 이벤트를 사용하려고했습니다. 맞습니까? – Suresh

    +1

    Suresh 내가 알아 차린 점은 콜백에서 사용하는 것입니다. proxy.Invoke ("method-B", "someValue") Wait(); 신호기가 서버로 메시지를 보내는 데 아마도 사용하는 스레드를 차단하고 있습니다. "현재 스레드를 전달하여 Dispatch 이벤트를 사용하려고했습니다"라는 의미는 아닙니다. 시작을 위해 Task.Run을 사용해보십시오. sth like Task.Run (() => proxy.Invoke ("method-B", "someValue"). Wait()); –

    +0

    'Client-method-A'에서 this.Dispatcher.Invoke (() => Testmethod()))를 사용하고 있습니다. 이 메소드 'Testmethod'에서 'method-B'를 호출하고 'Client-method-B'가 즉시 호출합니다. 이 접근법이 맞습니까? – Suresh

    관련 문제