hubcontext является нулевым сигнализатором - PullRequest
1 голос
/ 02 апреля 2012

На данный момент я научился уведомлять концентратор со стороны сервера.Затем концентратор передает уведомление клиенту.

Мой контекст, над которым я работаю, основан на отправке запроса на добавление в друзья (аналог Facebook).Где, если г-н X отправит запрос г-же Y, тогда только у г-жи Y будет всплывающее уведомление.

Поэтому я решил работать с группами.Я думаю, что одна группа - один пользователь.

Проблема в том, что я пытался при запуске концентратора сделать:

$. Connection.hub.start (function () {hub.login(XXX);});

где XXX будет именем пользователя или идентификатором пользователя из сеанса.Я не знаю, как это сделать.

Затем я попытался создать скрытую метку с именем пользователя или идентификатором пользователя, заполнить ее на page_load и затем взять со стороны клиента.Но клиентская сторона работает раньше серверной.

Затем я попытался использовать идентификатор соединения контекста концентратора.Но проблема, кажется, в том, что почти все, такие как контекст и менеджер группы, являются нулевыми в хабе.Это потому, что я использую экземпляр концентратора?или потому что у меня есть статические методы?(у меня должен быть статический / или другой экземпляр, поскольку я вызываю эти методы из другого серверного кода)

     using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SignalR.Hubs;
using SignalR;
using SignalR.Hosting.AspNet;
using System.Web;
using System.Web.SessionState;

namespace DataLayer
{
    public class NotificationHub: Hub
    {
        private static NotificationHub instance;

        private NotificationHub() { }

        public static NotificationHub Instance
        {
            get
            {
                if (instance == null)
                    instance = new NotificationHub();
                return instance;
            }
        }

        public void NotifyClients(int gid, string value)
        {
            IConnectionManager connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager));
            dynamic clients = connectionManager.GetClients<NotificationHub>();
            clients[gid.ToString()].newNotification(value);
            //let us then try to use connection id, but this.Context.ConnectionId is null

        }

        public void Login(string gid)
        {
            AddToGroup(gid);
        }

    }
}

Может быть, есть какой-то другой обходной путь к тому, что я хотел бы сделать?(т.е. разрешить каждому человеку иметь свои собственные уведомления?)

1 Ответ

4 голосов
/ 02 апреля 2012

Ваша js ссылка на концентратор должна быть $.connection.notificationHub, а не $.connection.hub.Это взято из имени класса вашего хаба.При желании вы можете переименовать его с помощью атрибута [HubName ("name")].

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

Редактировать: еще один совет - в хабе вам не нужно использовать ConnectionManager, чтобы получитьклиенты.Вы можете просто использовать свойство клиентов.IE, клиенты [gid.ToString ()]. ​​NewNotification (значение);

...