Вызвать метод signalR внутри клиентского метода

Я использую signalR версии 2.1.2. И я использую консольное приложение в качестве SignalrClient. Я вызываю метод-А, и после получения ответа я должен вызвать метод-Б на основе ответа от метода-А. В этом сценарии я могу успешно вызвать и не получить никакого ответа от метода-B. В чем моя ошибка??. Вот мой код

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();

Здесь я не получаю никакого ответа от «метода-B». Спасибо.


person Suresh    schedule 26.11.2014    source источник
comment
Вы должны опубликовать свой код Hub, там может быть проблема.   -  person crackhaus    schedule 26.11.2014


Ответы (2)


Лучший способ получить результат серверного метода SignalR — прочитать его возвращаемое значение вместо вызова клиентского метода на стороне вызывающего объекта. Например, вы можете прочитать ответ метода-A следующим образом:

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

Ожидание подписи метода-A выглядит примерно так:

public bool method-A(string p);

Таким образом, вам не нужно вызывать клиентский метод только для того, чтобы вернуть вызывающему объекту результат серверного метода. Вы можете вызвать другой метод сервера из обратного вызова другого вызова метода сервера следующим образом:

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 возвращает строковое значение на стороне сервера.

person Xmindz    schedule 28.11.2014
comment
Спасибо @XmindZ. Работает нормально............:) И еще один момент. Вы должны вызвать метод wait(), чтобы получить результат... То есть ›proxy.Invoke(method-B, someValue ).ContinueWith((u) =› { Console.WriteLine(Method-B response: + u.Result); }).wait(); Только тогда мы сможем получить результат от вызывающего метода – - person Suresh; 01.12.2014

В предоставленном коде вы создаете прокси

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

но позже ты используешь

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

так это просто тип и прокси == hubProxy?

Я бы посоветовал вам сделать 3 вещи

  1. используйте wireshark, чтобы проверить, есть ли реальный трафик на сервер при вызове метода B
  2. проверьте на стороне сервера, правильно ли сервер вызывает операцию
  3. вы можете попытаться отправить операцию B, чтобы она не вызывалась в контексте обратного вызова - в зависимости от вашего приложения вы можете использовать Dispatcher или просто Task.Run. Я не уверен насчет клиента signalr, но некоторым фреймворкам не нравится, когда вы вызываете их методы в обратных вызовах.
person Łukasz Zwierko    schedule 26.11.2014
comment
Привет, Лукаш, я отредактировал свой вопрос. Я только что попытался использовать событие Dispatch, чтобы обойти текущий поток. Это правильно? - person Suresh; 26.11.2014
comment
Суреш одну вещь, которую я заметил: в обратном вызове вы используете proxy.Invoke(method-B, someValue).Wait(); поэтому вы блокируете поток, который сигнализатор, вероятно, использует для отправки сообщения на сервер. Не уверен, что вы имеете в виду, говоря, что я только что попытался использовать событие Dispatch, чтобы обойти текущий поток? Попробуйте использовать Task.Run для запуска, хорошо? что-то вроде Task.Run(() => proxy.Invoke(method-B, someValue).Wait()); - person Łukasz Zwierko; 26.11.2014
comment
Я использую this.Dispatcher.Invoke(() =› Testmethod())) в 'Client-method-A'. В этом методе «Тестовый метод» я вызову «метод-B», а «Клиентский метод-B» вызовет немедленно. Является ли этот подход правильным? - person Suresh; 27.11.2014
comment
Это зависит от. Вы видите, что основная проблема в вашем коде, я полагаю, вызывает .Wait() в контексте потока, который используется клиентом signalR для выполнения вызова. Использование Dispatch.Invoke может помочь, но все же помните, что при использовании статического вызова Invoke будет использоваться диспетчер текущего потока, поэтому не уверен, что именно это будет в вашем случае (например, для консольного приложения диспетчер по умолчанию не создан). - person Łukasz Zwierko; 27.11.2014