本篇文章主要介紹了在ASP.NET Core下使用SignalR技術 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
一、前言
上次我們講到過如何在ASP.NET Core中使用WebSocket 。這次的主角是SignalR它為我們提供了簡化操作WebSocket的架構。
ASP .NET SignalR 是一個ASP.NET 下的類庫,可以在ASP.NET 的Web項目中實現即時通訊。什麼是即時通訊的Web呢?就是讓用戶端(Web頁面)和伺服器端可以互相通知訊息及調用方法,當然這是即時操作的。WebSockets是HTML5提供的新的API,可以在Web網頁與伺服器端間建立Socket串連,當WebSockets可用時(即瀏覽器支援Html5)SignalR使用WebSockets,當不支援時SignalR將使用其它技術來保證達到相同效果。
SignalR當然也提供了非常簡單易用的高階API,使伺服器端可以單個或批量調用用戶端上的JavaScript函數,並且非常 方便地進行串連管理,例如用戶端串連到伺服器端,或中斷連線,用戶端分組,以及用戶端授權,使用SignalR都非常容易實現。
二、SignalR目前情況
我們知道在ASP.NET Core 1.0.x 版本中並沒有包含SignalR,但是SignalR技術計劃整合在ASP.NET Core 1.2版本中,並且它的Team Dev還要使用TypeScript對它的javascript用戶端進行重寫,服務端方面也會貼近ASP.NET Core的開發方式,比如會整合到ASP.NET Core依賴注入架構中。
目前的情況就是在1.0中無法使用SignalR技術,本文實現的Demo都是在1.1下進行的。
三、整合SignalR
當然ASP.NET Core 1.2離正式發布還有一段時間,目前想整合SignalR都不是現成的方案,我們要通過手動的方式整合SignalR。
要在ASP.NET Core中使用SignalR,要先引用Microsoft.AspNetCore.SignalR.Server 、 Microsoft.AspNetCore.WebSockets 的NuGet Package包。
當然上面也說過目前沒有ASP.NET Core沒有整合SignalR,所以NUGET上也找不到SignalR的程式包,想添加引用我們就得去MyGet上去找找。
1.添加NuGet源
在程式根目錄建立一個命為NuGet.Config的檔案內容如下:
<?xml version="0" encoding="utf-8"?><configuration> <packageSources> <clear/> <add key="aspnetcidev" value="https://dotnetmygetorg/F/aspnetcore-ci-dev/api/v3/indexjson"/> <add key="apinugetorg" value="https://apinugetorg/v3/indexjson"/> </packageSources></configuration>
當然我們也可以通過在Visual Studio中設定 NuGet Packages的源,來引用這個程式集。
2.在project.json添加引用
"MicrosoftAspNetCoreSignalRServer": "0-*","MicrosoftAspNetCoreWebSockets": "0-*"
可以注意到SignalR的版本是0.2.0的alpha版本,所以後續版本可能變化也會比較大! 聽說是好重寫的。
值得注意的是,SignalR目前只能在ASP.NET Core 1.1及以上版本上使用,在這個文章中我使用的.NET Core SDK版本為 1.0.0-preview2-003131 ,所以引用有問題的同學可以嘗試把CoreApp版本改為1.1,所有AspNetCore的程式集也都改變為1.1的版本。
3.添加配置代碼
我們需要在Startup類中的 ConfigureServices方法中添加如下代碼:
public void ConfigureServices(IServiceCollection services){ servicesAddSignalR(options => { optionsHubsEnableDetailedErrors = true; });}
在Startup類中的Configure方法中添加如下代碼:
appUseWebSockets();appUseSignalR();
4.添加一個HUB類
這裡我們只實現一個小Demo,一個簡單的聊天室,多個人進入可以看到各自發送的資訊:
public class ChatHub : Hub{ public static List<string> ConnectedUsers; public void Send(string originatorUser, string message) { ClientsAllmessageReceived(originatorUser, message); } public void Connect(string newUser) { if (ConnectedUsers == null) ConnectedUsers = new List<string>(); ConnectedUsersAdd(newUser); ClientsCallergetConnectedUsers(ConnectedUsers); ClientsOthersnewUserAdded(newUser); }}
5.用戶端支援
在wwwroot目錄下建立一個名為chat.html的Html靜態檔案,內容如下:
<!DOCTYPE html><html><head> <title>Awesome Chat Application</title> <meta charset="utf-8" /></head><body> <style type="text/css"> userListp{ float: right; } </style> <ul id="messages"></ul> <input type="text" id="messageBox" /> <input type="button" id="sendMessage" value="Send Message!" /> <p class="userListp"> <ul id="userList"> </ul> </p> <script src="http://ajaxaspnetcdncom/ajax/jQuery/jquery-minjs"></script> <script src="http://ajaxaspnetcdncom/ajax/signalr/jquerysignalr-minjs"></script> <script src="signalr/hubs"></script> <script src="chatjs"></script></body></html>
同目錄下建立一個chat.js添加要實現功能的指令碼:
var userName = prompt("Enter your name: ");var chat = $connectionchatHub;chatclientmessageReceived = function (originatorUser, message) { $("#messages")append('<li><strong>' + originatorUser + '</strong>: ' + message);};chatclientgetConnectedUsers = function (userList) { for (var i = 0; i < userListlength; i++) addUser(userList[i]);};chatclientnewUserAdded = function (newUser) { addUser(newUser);}$("#messageBox")focus();$("#sendMessage")click(function () { chatserversend(userName, $("#messageBox")val()); $("#messageBox")val(""); $("#messageBox")focus();});$("#messageBox")keyup(function (event) { if (eventkeyCode == 13) $("#sendMessage")click();});function addUser(user){ $("#userList")append('<li>' + user + '</li>');}$connectionhublogging = true;$connectionhubstart()done(function () { chatserverconnect(userName);});
最後我們來運行它吧:
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援topic.alibabacloud.com。