SignalR总结

SignalR总结

  • SignalR版本
  • SingalR相关的DLL
  • 使用SignalR
    • 创建集线器
    • 用HTML和JavaScript创建客户端
    • 具体使用中的更改
  • 附录(Clitents广播方法)

SignalR版本

  1. 文章是基于SignalR版本1.2.2,.NET Framwork 4.0。
  2. 使用SignalR,如果客户端不支持WebSorcket,那么会自动切换到轮询机制。
    (.NET Framwork 4.0只能使用SignalR 1.X版本,要使用2.X版本必须将.NET框架更改为4.5或以上,如果无法更改.NET框架,那就只能使用1.X版本了)

SingalR相关的DLL

SignalR包含多个NuGet包:

  1. Microsoft.AspNet.SignalR (用于引用其他包,用于服务器端实现)
  2. Microsoft.AspNet.SignalR.Core (SignalR核心包,包含Hub类)
  3. Microsoft.AspNet.SignalR.SystemWeb (用于定义路由)
  4. Microsoft.AspNet.SignalR.JavaScript (包含用于客户端的JavaScript库)
  5. Microsoft.AspNet.SignalR.Client (包含用于.NET客户端类型)

可以用NuGet包管理安装,不过,我是直接用.dll文件直接引用了,主要的Dll文件:

  1. Microsoft.AspNet.SignalR.Core.dll (1.2.2)
  2. Microsoft.AspNet.SignalR.SystemWeb.dll(1.2.2)
  3. Microsoft.AspNet.SignalR.Owin.dll(1.2.2)
  4. Microsoft.Owin.Host.SystemWeb.dll(1.0.1)
  5. Newtonsoft.Json.dll(6.0.4)
  6. Owin.dll(1.0)
  7. jquery.signalR-1.2.2.min.js

注:在引用Newtonsoft.Json.dll时,如果项目中已存在该文件,需要替换(我原本项目中的版本为Newtonsoft.Json.dll 4.5,需要替换为6.0,如果是高版本就不知道了)否则会有错误,我的js文件是通过NuGet包获取下来的(用NuGet包获取会获取到很多js)。

使用SignalR

创建集线器

  1. 在Global文件中添加SignalR映射,这里需要注意的是要将这句代码写在前面。
        protected void Application_Start()
        {
            //添加 SignalR 映射
            RouteTable.Routes.MapHubs();
        }
  1. 如果使用的是SignalR2.X版本,可以使用一个OWIN Startup类
		public class Startup
		{
			public void Configuration(IAppBuilder app)
			{
				app.MapSignalR();
			}
		}
  1. 创建集线器Hub
    这里示例了方法Send,客户端可以调用Send方法给所有连接(Clients.All)调用BroadcostMessage方法。
		public class ChatHub:Hub
		{
	      	public void Send(string name, string message) {
				Clients.All.BroadcostMessage(name,message);
			}
		}

用HTML和JavaScript创建客户端

客户端需要包含两个js引用:

    
    

其中hubs.js文件在物理路径中不存在,自动生成。js中的主要代码:

    
  1. $.connection.chatHub返回一个集线器代理来调用ChatHub类中的方法,如果在ChatHub类中没有定义名称的话会自动取类的名称,例如,如果定义了[HubName(“signalRHub”)],那么js文件中需要写成$.connection.signalRHub;
  2. $.connection.hub.start() 启动连接;
  3. chat.client.broadcastMessage 定义了服务器端集线器代码调用BroadcostMessage时调用的函数;
  4. chat.server.send(‘NAME’,‘MESSAGE’) 这里假设了一个发送按钮将消息发送到服务器

具体使用中的更改

  1. 将jquery.signalR-1.2.2.min.js文件中删除一处Stop(1,1,1),目的是SignalR在断网等情况下自动重连次数有限,一般在10次以内,删除后无限次数重连直到重连成功。
  2. 封装广播方法,其中,委托FilterInvoker是为了过滤要发送的连接,字典_dictionary以连接ID为主键保存了连接的参数信息。
	public delegate bool FilterInvoker (Dictionary dicParams,object message);
    public class SignalRHelper
    {
        /// 
        /// 广播消息
        /// 
        /// 
        /// 
        /// 
        public static void Broadcost(string name,object message, FilterInvoker broadcostFilter)
        {
            Dictionary> dicConnections = GetConnectionDic();
            IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext();
            // 循环判断连接中的参数是否一致,一致则发送数据
            foreach (var dic in dicConnections)
            {
                if (broadcostFilter(dic.Value, message))
                {
                    _hubContext.Clients.Client(dic.Key).BroadcastMessage (name, message);
                }
            }
        }

        /// 
        /// 获取连接信息
        /// 
        /// 
        public static Dictionary> GetConnectionDic()
        {
            return new Dictionary>(ChatHub._dictionary);
        }
    }

附录(Clitents广播方法)

  1. Clients.All() //给所有连接广播消息
  2. Clients.Others() //排除本人给其他连接广播消息
  3. Clients.Caller() //给当前连接广播消息
  4. Clients.AllExcept(excludeConnectionIds) //排除excludeConnectionIds中连接给其他所有连接广播消息
  5. Clients.Client(connectionId) //给某个连接广播消息
  6. Clients.Group(groupName,excludeConnectionIds) //该某个名称为groupName的群组广播消息排除excludeConnectionIds中的连接,相当于黑名单

你可能感兴趣的:(C#语言学习)