【问题标题】:How to create groups in SignalR如何在 SignalR 中创建组
【发布时间】:2016-08-25 07:59:40
【问题描述】:

我需要在我的 signalR 集线器中创建组,但 Context.ConnectionId 行为空:

public class MetricHub : Hub
    {
        public MetricHub()
        {
            Groups.Add(Context.ConnectionId, "Syslog");
            Groups.Add(Context.ConnectionId, "Heatmap");
        }
    }

这是使用 MetricHub 类的 backgroundTicker 类:

using AutoMapper;
using Makbin.Data;
using Makbin.Web.Model;
using Makbin.Web.ViewModels;
using Microsoft.AspNet.SignalR;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Hosting;

namespace Makbin.Web.Hubs
{
    public class test
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    public class BackgroundTicker : IRegisteredObject
    {

        private readonly MakbinRepository _repository;
        private Timer devicesTimer;
        private IHubContext hub;



        public BackgroundTicker()
        {

            _repository = new MakbinRepository();

            HostingEnvironment.RegisterObject(this);

            hub = GlobalHost.ConnectionManager.GetHubContext<MetricHub>();           



            devicesTimer = new Timer(OnDevicesTimerElapsed, null,
                TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5));
        }


        private void OnDevicesTimerElapsed(object sender)
        {

            var result = _repository.Peripherals.Select(x => new { x.PeripheralId, x.Severity });
            var finalResult = JsonConvert.SerializeObject(result, Formatting.None,
                        new JsonSerializerSettings()
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });

            hub.Clients.Group("Heatmap").broadcastMessage(DateTime.UtcNow.ToString(), finalResult);
        }

        public void Stop(bool immediate)
        {
            //deviceDetailTimer.Dispose();
            devicesTimer.Dispose();

            HostingEnvironment.UnregisterObject(this);
        }
    }
}

此代码的目的是在发送任何数据之前定义组。 这里我定义了两个组:Syslog、Heatmap。此外,我与客户端的连接是单向的(服务器到客户端)。

【问题讨论】:

    标签: asp.net-mvc signalr


    【解决方案1】:

    不要忘记在Configuration 函数中映射signalR(配置身份验证后):

    public void Configuration(IAppBuilder app)
    {
    
        // Enable the application to use a cookie to store information for the signed i user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Home/Index")
        });
    
       ...
    
    
        app.MapSignalR();
    }
    

    signalR 入门:

    http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

    【讨论】:

    • 我的项目中没有任何身份验证部分,进行身份验证重要吗?
    • 不是强制的,重要的一行是app.MapSignalR();
    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多