使用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主题相符合,最终的效果图如下:

 代码下载

请路过的大神多多指正! 

posted @ 2015-03-25 20:21 彼年豆蔻 阅读(...) 评论(...) 编辑 收藏