2014-10-24 2 views
7

Я использую SignalR в версии 2.1.2. Я заметил, что для меня есть два общедоступных класса хаба: Hub и Hub<T>. Первая имеет страницу MSDN, которая, как представляется, устарела, а вторая вообще не имеет какой-либо страницы MSDN. Я считаю, что документация MSDN не обновляется с последней версией SignalR из Nuget (которую я использую), потому что источники, декомпилированные с помощью ReSharper, показывают, что оба класса наследуют базовый класс HubBase. Данная страница MSDN по иерархии наследования раздел показывает Hub класса как унаследовав от Object и реализаций IHub и IDisposable интерфейсов, однако декомпилированные источники показывают вышеупомянутый HubBase базовый класс, реализующий интерфейс IHub, который в своей очереди реализует IDisposable.Как использовать общий концентратор в SignalR

Разница между необщим и общим вариантом классов является то, что необщим своим Clients свойства возвращает IHubCallerConnectionContext<dynamic> в то время как общий вариант возвращение напечатало IHubCallerConnectionContext<T>.

Я бы хотел, чтобы мои клиенты набрали, поэтому, когда я вызываю клиентские методы из концентратора, у меня будет правильная поддержка Intellisense и строго типизированные аргументы. Однако я борюсь с тем, как позволить хабу знать, что метод моей модели клиента действительно вызывается в браузере.

Это мой TestModel класс:

public sealed class TestModel 
{ 
    public String Name { get; set; } 
    public void Notify() {} 
    public void NotifyComplex(TestModel model) {} 
} 

С необщей ступицей, я бы просто позвонить .Notify() или .Notify(new TestModel() { Name = "sth" }) на dynamic LY связанной this.Context.Clients.Client(…) или this.Context.Caller, но с общим классом, когда я называю эти пустые методы аналогичным образом, браузер не уведомляется вообще.

Как вы используете общий класс концентратора так, как он предполагается использовать?

+0

это может быть полезно: http://stackoverflow.com/a/21763587/526704 – DLeh

+0

Боюсь, этот вопрос не имеет никакого отношения. Я заинтересован в вызове методов клиента с сервера, а не наоборот, что делает OP этого вопроса и методы, которые я хочу вызывать с помощью RPC, не являются общими, но это хаб. клиентов. Однако я ценю этот комментарий. –

+0

Я не был уверен, будет ли это полезно или нет, но я думал, что предоставил бы то, что нашел. извините, у меня нет другой полезной проницательности :( – DLeh

ответ

8

Я нашел ответ. В документации MSDN не уточненный как еще, но сайт ASP .NET предлагает хороший SignalR учебники и один из них охватывает типизированных концентраторы:

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#stronglytypedhubs

В качестве примера в статье показывает, если вы используете интерфейс для аргумента типа, все работает, и вы получаете строго типизированных клиентов-концентраторов, методы которых корректно переведены на RPC. Вот кусок кода, который я испытал это с:

public sealed class TestHub 
    : Hub<ITestClient> 
{ 
    public override Task OnConnected() 
    { 
    this.Clients.Caller.SayHello("Hello from OnConnected!"); 
    return base.OnConnected(); 
    } 

    public void Hi() 
    { 
    // Say hello back to the client when client greets the server. 
    this.Clients.Caller.SayHello("Well, hello there!"); 
    } 
} 

public interface ITestClient 
{ 
    void SayHello(String greeting); 
} 
+1

Имейте в виду, что для того, чтобы вызвать метод OnConnected', вам необходимо зарегистрировать client method first: '$ .connection.testHub.client.sayHello = function (g) {...}'. По замыслу, клиент, который не может быть вызван, не запускает 'On [Connected | Reconnected | Disconnected]' методы и может ссылаться только на методы хаба аналогично парадигме запроса-ответа. –

Смежные вопросы