.net core 實時通訊


       最近在搞一個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">&nbsp;</div>
    <div class="row">
        <div class="col-6">&nbsp;</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">&nbsp;</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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
        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>

然后可以編譯運行了。

 

 

這樣實時應用就實現了,是不是很簡單?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM