在ASP.NET Core下使用SignalR技术
一、前言
上次我們講到過如何在ASP.NET Core中使用WebSocket,沒有閱讀過的朋友請參考?WebSocket in ASP.NET Core?文章?。這次的主角是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版本中,并且它的開發團隊還要使用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="1.0" encoding="utf-8"?>
<configuration>
? ?<packageSources>
? ? ? ?<clear/>
? ? ? ? ? ?<add key="aspnetcidev" value="https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json"/>
? ? ? ? ? ?<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json"/>
? ?</packageSources>
</configuration>
?
當然我們也可以通過在Visual Studio中設置?NuGet Packages的源,來引用這個程序集。
2.在project.json添加引用
"Microsoft.AspNetCore.SignalR.Server": "0.2.0-*",
"Microsoft.AspNetCore.WebSockets": "1.0.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)
{
? ? services.AddSignalR(options =>
? ? {
? ? ? ? options.Hubs.EnableDetailedErrors = true;
? ? ?});
}
在Startup類中的Configure方法中添加如下代碼:
app.UseWebSockets();
app.UseSignalR();
4.添加一個HUB類
這里我們只實現一個小Demo,一個簡單的聊天室,多個人進入可以看到各自發送的信息:
public class ChatHub : Hub
{
? ? ? ?public static List<string> ConnectedUsers;
? ? ? ?public void Send(string originatorUser, string message)
? ? ? ?{
? ? ? ? ? ?Clients.All.messageReceived(originatorUser, message);
? ? ? ?}
? ? ? ?public void Connect(string newUser)
? ? ? ?{
? ? ? ? ? ?if (ConnectedUsers == null)
? ? ? ? ? ? ? ?ConnectedUsers = new List<string>();
? ? ? ? ? ?ConnectedUsers.Add(newUser);
? ? ? ? ? ?Clients.Caller.getConnectedUsers(ConnectedUsers);
? ? ? ? ? ?Clients.Others.newUserAdded(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">
? ? ? ?.userListDiv{ float: right; }
? ?</style>
? ?<ul id="messages"></ul>
? ?<input type="text" id="messageBox" />
? ?<input type="button" id="sendMessage" value="Send Message!" />
? ?<div class="userListDiv">
? ? ? ?<ul id="userList"> </ul>
? ?</div>
?
? ?<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.0.min.js"></script>
? ?<script src="http://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"></script>
? ?<script src="signalr/hubs"></script>
? ?<script src="chat.js"></script>
</body>
</html>
同目錄下建立一個chat.js添加要實現功能的腳本:
var userName = prompt("Enter your name: ");
var chat = $.connection.chatHub;
chat.client.messageReceived = function (originatorUser, message) {
? ?$("#messages").append('<li><strong>' + originatorUser + '</strong>: ' + message);
};
chat.client.getConnectedUsers = function (userList) {
? ?for (var i = 0; i < userList.length; i++)
? ? ? ?addUser(userList[i]);
};
chat.client.newUserAdded = function (newUser) {
? ?addUser(newUser);
}
$("#messageBox").focus();
$("#sendMessage").click(function () {
? ?chat.server.send(userName, $("#messageBox").val());
? ?$("#messageBox").val("");
? ?$("#messageBox").focus();
});
$("#messageBox").keyup(function (event) {
? ?if (event.keyCode == 13)
? ? ? ?$("#sendMessage").click();
});
function addUser(user){
? ?$("#userList").append('<li>' + user + '</li>');
}
$.connection.hub.logging = true;
$.connection.hub.start().done(function () {
? ?chat.server.connect(userName);
});
最后我們來運行它吧:
?
四、最后
附上一個可用的Demo:https://github.com/maxzhang1985/AspNetCore.SignalRDemo
GitHub:https://github.com/maxzhang1985/YOYOFx? 如果覺還可以請Star下, 歡迎一起交流。?
.NET Core 開源學習群:?214741894??
相關文章:?
基于.NET SingalR,LayIM2.0實現的web聊天室
Signalr系列之虛擬目錄詳解與應用中的CDN加速實戰
ASP.NET SignalR 2.0入門指南
SignalR SelfHost實時消息,集成到web中,實現服務器消息推送
ASP.NET SignalR 高可用設計
WebSocket in ASP.NET Core
SignalR的性能監測與服務器的負載測試
原文地址:http://www.cnblogs.com/maxzhang1985/p/6364588.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的在ASP.NET Core下使用SignalR技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算设计模式(二)——断路器模式
- 下一篇: 云计算设计模式(三)——补偿交易模式