使用SignalR打造消息总线
使用SignalR为FineUI/Webform打造消息总线
第一次写博客,语言组织能力不好,请大家多多包涵!
效果图如下:
图片的右下角即为SignalR消息总线的消息框。
一、建立SignalR服务端
第一步:打开一个空的FineUI 4.5空项目文件,在空项目中建立文件夹SignalR(可以自定义名称)
加入SignalR引用,在程序包管理控制台输入命令:Install-package Microsoft.Aspnet.Signalr
加入SignalR成功后的项目目录
第二步:在空项目的根目录下建立SignalR文件夹,并在文件夹中建立Message消息类

1 using Newtonsoft.Json;
2
3 namespace EmptyProjectNet45_FineUI.SignalR
4 {
5 public class Message
6 {
7 [JsonProperty("type")]
8 public string Type { get; set; }
9
10 [JsonProperty("title")]
11 public string Title { get; set; }
12
13 [JsonProperty("content")]
14 public string Content { get; set; }
15 }
16 }

第三步:建立SignalR集线器类MessageHub
在文件夹SignalR中添加类文件MessageHub.cs
输入如下代码:

1 using Microsoft.AspNet.SignalR;
2 using Microsoft.AspNet.SignalR.Hubs;
3
4 namespace EmptyProjectNet45_FineUI.SignalR
5 {
6 /// <summary>
7 /// Message集线器类
8 /// </summary>
9 [HubName("messageHub")]
10 public class MessageHub : Hub
11 {
12 private readonly MessageHandler _messageHandler;
13
14 public MessageHub(): this(MessageHandler.Instance){ }
15
16 public MessageHub(MessageHandler messageHandler)
17 {
18 _messageHandler = messageHandler;
19 }
20
21 /// <summary>
22 /// 供客户端调用的方法
23 /// </summary>
24 /// <param name="message"></param>
25 public void SendMessage(Message message)
26 {
27 Clients.All.showMessage(message);
28 }
29 }
30 }

第四步:建立Message消息广播处理类MessageHandler,在文件夹SignalR中添加类文件MessageHandler.cs
输入如下代码:

1 using System;
2 using Microsoft.AspNet.SignalR;
3 using Microsoft.AspNet.SignalR.Hubs;
4
5 namespace EmptyProjectNet45_FineUI.SignalR
6 {
7 /// <summary>
8 /// Message消息广播处理类
9 /// </summary>
10 public class MessageHandler
11 {
12 private readonly static Lazy<MessageHandler> _instance =
13 new Lazy<MessageHandler>(() =>
14 new MessageHandler(GlobalHost.ConnectionManager.GetHubContext<MessageHub>().Clients));
15
16 private MessageHandler(IHubConnectionContext<dynamic> clients)
17 {
18 Clients = clients;
19 }
20
21 public static MessageHandler Instance { get { return _instance.Value; } }
22
23 public IHubConnectionContext<dynamic> Clients { get; set; }
24
25 /// <summary>
26 /// 向所有客户端发送消息
27 /// </summary>
28 /// <param name="msg"></param>
29 public void SendMessage(Message msg)
30 {
31 Clients.All.showMessage(msg);
32 }
33 }
34 }

第五步,建立Startup类,在文件夹SignalR中添加类文件MessageHandler.cs
输入如下代码:

1 using Microsoft.Owin;
2 using Owin;
3
4 [assembly :OwinStartup(typeof(EmptyProjectNet45_FineUI.SignalR.Startup))]
5 namespace EmptyProjectNet45_FineUI.SignalR
6 {
7 public class Startup
8 {
9 public void Configuration(IAppBuilder app)
10 {
11 app.MapSignalR();
12 }
13 }
14 }

第六步 建立全局信息类GlobalInfo,代码如下:

1 namespace EmptyProjectNet45_FineUI.Common
2 {
3 public class GlobalInfo
4 {
5 public static SignalR.MessageHandler MessageHandler { get { return SignalR.MessageHandler.Instance; } }
6 }
7 }

第七步 建立消息总线类MessageBus

1 using EmptyProjectNet45_FineUI.SignalR;
2
3 namespace EmptyProjectNet45_FineUI.Common
4 {
5 public class MessageBus
6 {
7 public static void SendMessage(Message message)
8 {
9 GlobalInfo.MessageHandler.SendMessage(message);
10 }
11 }
12 }

至此,SignalR服务端的代码就写完了
二、SignalR客户端代码
第一步,打开default.asp页面,引入jquery-1.6.4.min.js和jquery.signalR-2.2.0.min.js,和加入<script src="/SignalR/hubs"></script>引用(注意这个目录是不存在的,但是SignalR运行必须的虚拟目录),引用结构如下:
1 <script src="Scripts/jquery-1.6.4.min.js"></script>
2 <script src="Scripts/jquery.signalR-2.2.0.min.js"></script>
3 <script src="/SignalR/hubs"></script>
第二步:加入客户端代码
代码如下:

1 <script>
2 $(function () {
3 var handler = $.connection.messageHub;// 生成客户端hub代理
4
5 // 添加客户端hub方法以供服务端调用
6 // 向列表中添加航班信息
7 handler.client.showMessage = function (msg) {
8 windowTips(null, null, msg.content);
9 }
10
11 //日志输出,以备调试使用
12 $.connection.hub.logging = true;
13 // 开启hub连接
14 $.connection.hub.start();
15 });
16 </script>

到此,客户端代码也写完了
三、SignalR消息发送测试
在fineui空项目自带的hello页面加入一个button按钮,命名为“显示信息”,并加入按钮的onClick事件,
页面代码如下:

1 <%@ Page Language="C#" AutoEventWireup="True" CodeBehind="hello.aspx.cs" Inherits="EmptyProjectNet45_FineUI.hello" %>
2
3 <!DOCTYPE html>
4 <html>
5 <head runat="server">
6 <title></title>
7 </head>
8 <body>
9 <form id="form1" runat="server">
10 <f:PageManager ID="PageManager1" runat="server" />
11 <f:Button Text="点击弹出对话框" runat="server" ID="btnHello" OnClick="btnHello_Click"/>
12 <f:Button runat="server" ID="btnShowInfo" Text="显示消息" Icon="Mail" OnClick="btnShowInfo_OnClick"/>
13 </form>
14 </body>
15 </html>

后台代码:

using System;
using EmptyProjectNet45_FineUI.Common;
using EmptyProjectNet45_FineUI.SignalR;
using FineUI; namespace EmptyProjectNet45_FineUI
{
public partial class hello : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } protected void btnHello_Click(object sender, EventArgs e)
{
Alert.Show("你好 FineUI!", MessageBoxIcon.Warning);
} protected void btnShowInfo_OnClick(object sender, EventArgs e)
{
MessageBus.SendMessage(new Message{Type = "info",Title = "测试消息",Content = "这是由SignalR发出的消息!"});
}
}
}

编译代码,运行程序,点击“显示信息”按钮,效果如下:
消息总线已经初步建立起来了,但alert弹出框的样式实在是不好看,也不够友好。但本人的实在是不懂css也不懂js,就从网上下载了一个基于jquery的右下角弹出框,并简单修改了一下样式,使其与fineui主题相符合,最终的效果图如下:
请路过的大神多多指正!
使用SignalR打造消息总线的更多相关文章
- 使用SignalR为FineUI/Webform打造消息总线
第一次写博客,语言组织能力不好,请大家多多包涵! 效果图如下: 图片的右下角即为SignalR消息总线的消息框. 一.建立SignalR服务端 第一步:打开一个空的FineUI 4.5空项目文件,在空 ...
- Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
背景 对于Android系统来说,消息传递是最基本的组件,每一个App内的不同页面,不同组件都在进行消息传递.消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信.对 ...
- 使用ABP SignalR重构消息服务(一)
使用ABP SignalR重构消息服务 最近协助蟹老板升级新框架,维护基础设施服务,目前已经稳了. 早上蟹老板看到我进入公司,马上就叫停我,说我为什么左脚先进公司,你这样会让我很难做耶,这样把我给你一 ...
- 基于SignalR的消息推送与二维码描登录实现
1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载
一.分布式消息总线 在很多MIS项目之中都有这样的需求,需要一个及时.高效的的通知机制,即比如当使用者A完成了任务X,就需要立即告知使用者B任务X已经完成,在通常的情况下,开发人中都是在使用者B所使用 ...
- EBS 消息总线
http://www.ibm.com/developerworks/cn/webservices/ws-whyesb/ 开发人员为何需要企业服务总线? 本文不仅仅是为架构师准备的:使用企业服务总线 ( ...
- 开源消息总线ActiveMQ
一.消息中间件MOM(Message-Oriented Middleware) 消息中间件是解决异步分布式系统中通讯和排队问题的中间件技术.它利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数 ...
- AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...
随机推荐
- Atitit.Hibernate于Criteria 使用汇总and 关系查询 and 按照子对象查询 o9o
Atitit.Hibernate于Criteria 使用总结and 关联查询 and 依照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 基本的对象黑头配置磊 ...
- Kohana 数据库
只要不使用官方网站的教程,自己摸索出来的,有一个错误,当我们指了出来,哦,,好吧共同进步~ 首先配置:modules\database\config\database.php <?php 'de ...
- Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱
本文主要介绍Java里经常使用的子类和父类的变量实例化顺序及陷阱,并结合一个Android实例来探讨此问题.日后编程中应尽量避免此陷阱. 首先看以下一段代码: 定义一个虚类Server.java pa ...
- 微信oauth获取用户的信息页面授权
參考链接(请在微信client中打开此链接体验) Scope为snsapi_base https://open.weixin.qq.com/connect/oauth2/authorize?appid ...
- 【jQuery】使用JQ要准备的主要淡入淡出效果
jQuery是JavaScript 库.也就是JavaScript延期,加入满足不同效果的不断增长的需求.事实上质量JavaScript 下面写的一大JQ方案说明JQ. .基本目标 网页中有例如以下三 ...
- iis7、iis8配置备份还原
原文 iis7.iis8配置备份还原 方法1: 1.打开我们的IIS管理器,在功能视图里找到“共享的配置”这个功能然后双击进入. 2.进入“共享的配置”后单机右上方的“导出配置”选项,选择导出配置文件 ...
- 光流和KLT
一 光流 光流的概念是Gibson在1950年首先提出来的. 它是空间运动物体在观察成像平面上的像素运动的瞬时速度.是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存 ...
- hdu 4919 Exclusive or
Exclusive or Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) T ...
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- 从头学起android<android基本的绘图.四十六.>
在一般的图形渲染用户通常只需要重写onDraw()该方法可以是.但是假设,才能真正完成绘图操作.此外,我们需要掌握的四大核心经营类: android.graphics.Bitmap:主要表示的是一个图 ...