使用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主題相符合,最終的效果圖以下:

 代碼下載

請路過的大神多多指正! 

相關文章
相關標籤/搜索