WinForm中 Asp.Net Signalr消息推送測試實例html
上面描述都是官方文檔中提出的,個人測試項目的主要需求以下:jquery
基本的流程圖:web
等待瀏覽器
有了明確的需求,打開VS直接開幹。服務器
建立一個SignalR廣播服務只需三步app
// [HubName("MyHub"), Authorize] public class MyHub : Hub { public List<string> UserIdList1 { get; } = new List<string>(); /// <summary> /// 信息廣播 /// </summary> /// <param name="identify">iot惟一標識</param> /// <param name="model">數據模型</param> [HubMethodName("Send")] public void Send(string identify, IOTModel model) { Clients.All.addMessage(identify, model); } /// <summary> /// 錯誤日誌廣播 /// </summary> /// <param name="identify">惟一標示</param> /// <param name="errMessage">錯誤信息</param> [HubMethodName("ErrSend")] public void Send(string identify, string errMessage) { Clients.All.addMessage(identify, errMessage); } /// <summary> /// 向首次鏈接的客戶端返回實時數據,用於展現 /// </summary> /// <param name="identify"></param> /// <param name="list"></param> [HubMethodName("initSend")] public void Send(string identify, List<IOTModel> list) { Clients.All.initData(identify, list); } public override Task OnConnected() { UserIdList1.Add(Context.ConnectionId); //首次鏈接須要返回MongoDB中的最後一條記錄供客戶端展現 Send("IotList", ProdMongoDB.GetLastData()); return base.OnConnected(); } public override Task OnDisconnected(bool stopCalled) { UserIdList1.Remove(Context.ConnectionId); return base.OnDisconnected(stopCalled); } public override Task OnReconnected() { UserIdList1.Add(Context.ConnectionId); return base.OnReconnected(); } }
開啓服務以前須要設置服務的IP和端口asp.net
private IDisposable SignalR { get; set; } private string ServerURI = "http://" + ConfigurationManager.AppSettings["signalrAdress"]; private async void RunServer() { await Task.Run(() => StartServer()); } private void StartServer() { try { SignalR = WebApp.Start(ServerURI); } catch (TargetInvocationException) { SignalR.Dispose(); Console.WriteLine("Server failed to start. A server is already running on " + ServerURI); return; } }
此客戶端只負責給服務器發送信息,不接收服務器的廣播信息,建立過程以下:異步
//定義代理,廣播服務鏈接相關 private static IHubProxy HubProxy { get; set; } private static readonly string ServerUrl = ConfigurationManager.AppSettings["signalrServer"]; //private static string _serverUrl =""; //定義一個鏈接對象 public static HubConnection Connection { get; set; }
//異步鏈接服務器 private async void ConnectAsync() { Connection = new HubConnection(ServerURI); Connection.Closed += Connection_Closed; ; HubProxy = Connection.CreateHubProxy("MyHub"); try { await Connection.Start(); } catch (HttpRequestException) { _logger.Error("Unable to connect to server: Start server before connecting clients."); return; } }
HubProxy.Invoke("Send", "aaa", message);
發送信息中調用的Send是服務端HUB類中定義的發送方法,根據實際需求定義和使用方法。async
winform 客戶端中定義鏈接服務端和上面2中的相同,不一樣之處是這個客戶端只接收信息不發送信息。ide
跳過鏈接服務的部分
Connection = new HubConnection(_serverUrl); Connection.Closed += Connection_Closed; HubProxy = Connection.CreateHubProxy("MyHub"); HubProxy.On<string, IOTModel>("AddMessage", RecvMsg);//接收實時信息 HubProxy.On<string, string>("addMessage", RecvMsg);//接收錯誤日誌 HubProxy.On<string, List<IOTModel>>("initData", RecvMsg);//初始化監測數據
private static void RecvMsg(string identifiy, string errMessage) { if (identifiy != "ErrorInfo") return; ErrorList.Add("錯誤信息:"+ errMessage + ",接收時間:" + DateTime.Now); //實時添加到richBox中 if (ErrorBox.InvokeRequired) { ErrorBox.Invoke((Action)(() => ErrorBox.AppendText("錯誤信息:" + errMessage + ",接收時間:" + DateTime.Now + "\r\n"))); return; } ErrorBox.AppendText("錯誤信息:" + errMessage + ",接收時間:" + DateTime.Now + "\r\n"); }
創建web端客戶端也比較簡單,具體以下:
所需的js文件如上。
<script src="Scripts/jquery-3.0.0.js"></script> <script src="Scripts/jquery.signalR-2.2.2.js"></script> <script src="http://172.30.16.165:805/signalr/hubs"></script>
$(function() { //配置hub服務器的地址 $.connection.hub.url = "http://localhost:888/signalr"; //聲明一個hub的代理,此處的MyHub爲服務器端配置的Hub名稱 var proxy = $.connection.myHub; //定義函數,接收服務廣播,addMessage爲服務端定義的客戶端接收的方法 proxy.client.addMessage = function(name, message) { //對接收到的數據進行解析 if (name === "FYIot") { var html = "<tr><td>" + message.ConfigCode + "</td>"; html += "<td>" + message.ConfigValue + "</td>"; html += "<td>" + moment(message.SaveDate).format("YYYY-MM-DD HH:mm:ss") + "</td></tr>"; $("#sigBody").append(html); } } //鏈接服務 $.connection.hub.start().done(); $("#tableDiv").slimScroll({ height: 500 }); });
<div style="text-align: center"> <h3>實時數據</h3> </div> <div style="width: 100%; padding: 20px;" id="tableDiv"> <table class="table table-bordered table-hover"> <thead> <tr> <th width="50%">監測項編號</th> <th width="20%">監測值</th> <th width="30%">監測時間</th> </tr> </thead> <tbody id="sigBody"> <tr> </tr> </tbody> </table> </div>