2014-01-08 5 views
1

Я работаю над проектом, который должен взаимодействовать с пользователями в реальном времени. В основном я следую примеру «синхронизировать страницы по веб-апи», который вводится в this video (также у Брэда Уилсона есть приятное видео, подобное этому) и repository here for video.Как я могу лучше контактировать между участниками приложения и веб-API и концентраторами Signalr

Мой вопрос касается отображения элементов приложения с помощью их ConnectionIds, который производит Signalr.

Я привык экономить каждый signalr идентификатор соединения в таблице базы данных, как:

ConnectionID

MemberID

ConnectionStatusID -> Connected (1), Disconnected (2), переподключения (3)

Я делал идентификаторы соединения членов в большинстве запросов.

Затем я решил изменить этот дизайн. Теперь я группируя каждый элемент с уникальной строкой, когда OnConnected и OnDisconnected как это:

public override Task OnConnected() 
{ 
    Groups.Add(this.Context.ConnectionId, string.Format("MyHub_{0}",HubUser.MemberID)); 
    return base.OnConnected(); 
} 

public override Task OnDisconnected() 
{ 
    Groups.Remove(this.Context.ConnectionId, string.Format("MyHub_{0}",HubUser.MemberID)); 
    return base.OnConnected(); 
} 

Сейчас я ничего из базы данных об идентификаторах соединения члена не выборки. Он работает только через веб-интерфейс для синхронизации между вкладками браузера.

Я просто показать, как я обработки входящего запроса и использование концентратора в Web API:

public HttpResponseMessage Example() 
{ 
    string msg = "Example to all"; 
    //some other process 

    //Hub is an instance of a IHubContext 

    Hub.Clients.Group(string.Format("MyHub_{0}", HubUser.MemberID)).example(msg); 

    return Request.CreateResponse(HttpStatusCode.OK, msg); 
} 

Так какой из них вы считаете эффективным способом для использования Signalr. Что бы вы предложили, возможно, лучше, чем эти. Является ли зависимость между концентратором и WebApi хорошим выбором дизайна.

А также проект будет развернут на несколько серверов, и Load Balancer будет работать перед ними (для этого я собираюсь использовать Sql Backplane). Есть несколько проектов, которые должны говорить с Web API, косвенно и с концентратором.

ответ

1

Мне нравится ваше второе решение, так как оно должно требовать меньше запросов БД. Для SignalR не менее эффективно отправлять группу, чем отправить ее на идентификатор соединения. Вам просто нужно, чтобы ваши имена групп (HubUser.MemberID) были уникальными и не поддающимися обману.

В SignalR 2.0, мы делаем эту модель еще проще: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider

Если MemberIDs ваших пользователей совпадают с их IPrincipal.Identity.Name, то вы можете просто изменить весь код, чтобы использовать Clients.User(HubUser.MemberID)....

Если вы не хотите использовать свой идентификатор пользователя SignalR на IPrincipal запроса, вы можете предоставить свой собственный IUserIdProvider и ввести его с помощью преобразователя зависимостей SignalR.

http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection

+0

спасибо за информацию, вы бы сказать мне, и что вы думаете о зависимости между Web API и signalr, как в моем случае. Есть ли у вас какие-либо соображения дизайна, из вашего опыта. Если у вас есть важные воспоминания о объединительной панели sql, не могли бы вы поделиться ими, пожалуйста. –