使用SignalR为FineUI/Webform打造消息总线

第一次写博客,语言组织能力很差,请你们多多包涵!css

效果图以下:html

 

图片的右下角即为SignalR消息总线的消息框。jquery

1、创建SignalR服务端app

第一步:打开一个空的FineUI 4.5空项目文件,在空项目中创建文件夹SignalR(能够自定义名称)测试

加入SignalR引用,在程序包管理控制台输入命令:Install-package Microsoft.Aspnet.Signalrui

加入SignalR成功后的项目目录this

 

第二步:在空项目的根目录下创建SignalR文件夹,并在文件夹中创建Message消息类spa

 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服务端的代码就写完了

2、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>

到此,客户端代码也写完了 

3、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主题相符合,最终的效果图以下:

 代码下载

请路过的大神多多指正!