2017-02-01 8 views
1

Я имею беспокойство о том, как использовать SgnalR по следующему сценарию:вызова метод клиента вне SignalR проекта

Существует услугу проект, не центр, который выполняет задачу трудоемкой периодически. Клиенты должны получать информацию о ходе выполнения задачи. После проведения некоторых исследований SignalR, казалось, был правильным выбором для этой цели.

Проблема в том, что я хочу, чтобы система Service-Hub-Clients была как можно более слабой. Итак, я прошел хаб в IIS и, как следует документация SignalR, добавил ссылку на контекст Hub во внешнем проекте и называется метод клиента:

hubContext = GlobalHost.ConnectionManager.GetHubContext<TheHub>() 
    hubContext.Clients.All.progress(n, i); 

стороне клиента:

private void InitHub() 
    { 
     hubConnection = new HubConnection(ConfigurationManager.AppSettings["hubConnection"]); 

     hubProxy = hubConnection.CreateHubProxy("TheHub"); 
     hubConnection.Start().Wait(); 
    } 

    hubProxy.On<int, int>("progress", (total, done) => 
     { 
      task1Bar.Invoke(t => t.Maximum = total); 
      task1Bar.Invoke(t => t.Value = done); 
     }); 

On на стороне клиента метод не вызывается, и после двух дней исследований я не могу заставить его работать, хотя при совершении вызова от самого концентратора он работает нормально. Я подозреваю, что мне не хватает какой-либо конфигурации.

+0

Можете ли вы показать нам больше кода о том, как вы создаете 'HubConnection' и 'IHubProxy' –

+0

Привет, Майкл. Я добавил код выше – GAG

+0

Хорошо, обычно это должно работать. Проверьте, являются ли 'n' и' i' оба типа 'int'. Кроме того, перегрузите метод «Задача OnConnected» в «TheHub» и проверьте, добавив точку останова, если после 'hubConnection.Start()' удаляется brakepoint. –

ответ

2

Вы не можете использовать диспетчер GlobalHost.Connection в своем классе или сервисе хаба, если вызывающий объект будет любым проектом, кроме веб-проекта.

GlobalHost.ConnectionManager.GetHubContext<TheHub>() 

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

// This method is what the caller sees, and abstracts the communication with the Hub 
public void NotifyGroup(string groupName, string message) 
{ 
    Execute("NotifyGroup", groupName, message); 
} 

// This is the method that calls the Hub 
private void Execute(string methodName, params object[] parameters) 
{ 
    using (var connection = new HubConnection("http://localhost/")) 
    { 
    _myHub = connection.CreateHubProxy("TheHub"); 
    connection.Start().Wait(); 
    _myHub.Invoke(methodName, parameters); 
    connection.Stop(); 
    } 
} 

Последний бит, который сам узел, должно быть что-то вроде:

public void NotifyGroup(string groupName, string message) 
{ 
    var group = Clients.Group(groupName); 
    if (group == null) 
    { 
    Log.IfWarn(() => $"Group '{groupName}' is not registered"); 
    return; 
    } 
    group.NotifyGroup(message); 
} 

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

  • Нет связанных вопросов^_^