最近在搞一個web平台的在線客服,用來反饋各地市縣區對平台使用的意見,有利於平台的升級和改進。對於B/S這種模式,前后端分離好像並不是太明顯。以前還真沒搞過這種形式的。在網上搜了一下,有點讓人無語,有的寫寫一半留一半,引入的東西可能自己都沒搞清楚。我看了許多,實在頭疼。最后我看了一下微軟的官方文檔,按照官方給的步驟,一步一步來,一會就能搞定了。
實現實時應用功能,要用到SignalR
下面我就一步一步的來把這個過程操作完,做個小Demo
首先新建一個工程,我建的是.net core 2.2 (注意一定要看版本,不同版本實現方式是有一點差異的,我看了.net core 3.1的,首先startup文件里的內容就所改變了。)
添加 SignalR 客戶端庫
-
在“解決方案資源管理器”中,右鍵單擊項目,然后選擇“添加”>“客戶端庫” 。
-
在“添加客戶端庫” 對話框中,對於“提供程序” ,選擇“unpkg” 。
-
對於“庫” ,輸入
@microsoft/signalr@3
,然后選擇不是預覽版的最新版本。
-
選擇“選擇特定文件” ,展開“dist/browser” 文件夾,然后選擇“signalr.js” 和“signalr.min.js” 。
-
將“目標位置” 設置為 wwwroot/lib/signalr/ ,然后選擇“安裝” 。
LibMan 創建 wwwroot/lib/signalr 文件夾並將所選文件復制到該文件夾
查看wwwroot/lib/signalr 會出現你引入的文件。
創建 SignalR 中心
中心是一個類,用作處理客戶端 - 服務器通信的高級管道。
-
在 項目文件夾中,創建 Hubs 文件夾 。
-
在 Hubs 文件夾中,使用以下代碼創建 ChatHub.cs 文件 :
public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } }
hatHub
類繼承自 SignalR Hub
類。 Hub
類管理連接、組和消息。
可通過已連接客戶端調用 SendMessage
,以向所有客戶端發送消息。 本教程后面部分將顯示調用該方法的 JavaScript 客戶端代碼。 SignalR 代碼是異步模式,可提供最大的可伸縮性。
配置 SignalR
必須配置 SignalR 服務器,以將 SignalR 請求傳遞到 SignalR。
注意:標紅的代碼就是配置的SignalR 服務
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace WebApplication4 { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSignalR(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseSignalR(routes => { routes.MapHub<Hubs.ChatHub>("/chatHub"); }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } } }
添加 SignalR 客戶端代碼
@{ ViewData["Title"] = "Home Page"; } <div class="container"> <div class="row"> </div> <div class="row"> <div class="col-6"> </div> <div class="col-6"> 用戶名<input type="text" id="userInput" /> <br /> 內容<input type="text" id="messageInput" /> <input type="button" id="sendButton" value="Send Message" /> </div> </div> <div class="row"> <div class="col-12"> <hr /> </div> </div> <div class="row"> <div class="col-6"> </div> <div class="col-6"> <ul id="messagesList"></ul> </div> </div> </div> <script src="~/lib/signalr/dist/browser/signalr.js"></script> <script> var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build(); //Disable send button until connection is established document.getElementById("sendButton").disabled = true; connection.on("ReceiveMessage", function (user, message) { var msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); var encodedMsg = user + " says " + msg; var li = document.createElement("li"); li.textContent = encodedMsg; document.getElementById("messagesList").appendChild(li); }); connection.start().then(function () { document.getElementById("sendButton").disabled = false; }).catch(function (err) { return console.error(err.toString()); }); document.getElementById("sendButton").addEventListener("click", function (event) { var user = document.getElementById("userInput").value; var message = document.getElementById("messageInput").value; connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); }); event.preventDefault(); }); </script>
然后可以編譯運行了。
這樣實時應用就實現了,是不是很簡單?