ASP.NET Core SingleR: 初めての経験とシンプルなプロジェクト構築

序文

通常のWeb通信はHTTPリクエストをベースとしており、リクエストごとにクローズされるため遅延が比較的大きいのが特徴です。Web ゲーム、Web チャット、その他の機能を実行したい場合は、インスタント メッセージングを使用する必要があります。SignalR はインスタントコミュニケーションの手段です。

Microsoft 公式 | ASP.NET Core SignR の概要

ここに画像の説明を挿入します

ここに画像の説明を挿入します

ここに画像の説明を挿入します

アプリケーションシナリオ

一般的なネットワーク リクエストは、データをデータベースに送り、Web ページ リクエストを使用してデータを読み取ることです。

硬件设备
上位机采集程序
数据库
后端
Http网络请求
网页

ただし、低遅延とリアルタイム要件の場合、このロジックは適用されません。リアルタイムの性質により、以前のデータは重要ではないため、破棄できることを意味します。生放送と同じように、人為的に録画されない限り、最初の 1 分間は誰もビデオを見ず、直接破棄することができます。

硬件设备
上位机采集程序
'直播'数据流
网页

ここでのライブブロードキャストとは、Douyu Live のようなビデオストリームではなく、リアルタイムデータを意味します。

SignalR の Web サイトはどのようなものですか?

Blazor は SignalR を使用して開発されています

ASP.NET Core Blazor ホスティング モデル

ここに画像の説明を挿入します
Blazor URL を見つけて見てみましょう。

ブートストラップ スタイルの Blazor UI コンポーネント ライブラリ

ここに画像の説明を挿入します

最初の ASP.NET Core SignalR プログラム

SignalR のバージョンを確認する

Microsoft には正式に 2 つの SignalR があり、1 つは .net Framework ベース、もう 1 つは .NET Core ベースです。Microsoft によると、SignalR のコア バージョンを使用することをお勧めします。

ここに画像の説明を挿入します

インターネット上で多くのチュートリアルを見つけましたが、バージョンが古すぎるか、答えが間違っています。Microsoft のチュートリアルに従って確認することをお勧めします。ちなみに、長い間検索したところ、Microsoft の最新の .net core 8.0 チュートリアルを見つけました。

Microsoft 公式ドキュメント | チュートリアル: ASP.NET Core SignalR の概要

ここに画像の説明を挿入します

新しい MVC プロジェクトを作成する

Microsoft の意向に従って、Blazor プログラムの代わりに ASP.NET Core Web を開きます

ここに画像の説明を挿入します
ここに画像の説明を挿入します

unpkgマネージャーを追加

ここに画像の説明を挿入します

長い間オンラインで検索した結果、LibMan をインストールする必要があることがわかりました。

ASP.NET Core での LibMan CLI の使用

dotnet tool install -g Microsoft.Web.LibraryManager.Cli

これには外部ネットワークに接続する必要があり、内部ネットワークでエラーが報告される可能性があります。
ここに画像の説明を挿入します

インストール成功
ここに画像の説明を挿入します

これを実行してバージョンを確認し、インストールが成功したかどうかを確認します。

libman --version

ここに画像の説明を挿入します

クライアントの追加

ここに画像の説明を挿入します

ここに画像の説明を挿入します
ここに画像の説明を挿入します

ここに画像の説明を挿入します

ChatHub ファイルを追加する

ここに画像の説明を挿入します

using Microsoft.AspNetCore.SignalR;

namespace SiganlRTest.Hubs
{
    
    
    public class ChatHub : Hub
    {
    
    
        public async Task SendMessage(string user, string message)
        {
    
    
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
    }
}


SignalR サービスを追加する

ここに画像の説明を挿入します

ウェブページを追加

@page
<div class="container">
    <div class="row p-1">
        <div class="col-1">User</div>
        <div class="col-5"><input type="text" id="userInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-1">Message</div>
        <div class="col-5"><input type="text" class="w-100" id="messageInput" /></div>
    </div>
    <div class="row p-1">
        <div class="col-6 text-end">
            <input type="button" id="sendButton" value="Send Message" />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <hr />
        </div>
    </div>
    <div class="row p-1">
        <div class="col-6">
            <ul id="messagesList"></ul>
        </div>
    </div>
</div>
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>

ここに画像の説明を挿入します
ここに画像の説明を挿入します
そこに Microsoft コードをコピーします

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

//Disable the send button until connection is established.
document.getElementById("sendButton").disabled = true;

connection.on("ReceiveMessage", function (user, message) {
    
    
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    // We can assign user-supplied strings to an element's textContent because it
    // is not interpreted as markup. If you're assigning in any other way, you 
    // should be aware of possible script injection concerns.
    li.textContent = `${
      
      user} says ${
      
      message}`;
});

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();
});

テストの実行

ここに画像の説明を挿入します

ブラウザ WebSocket のデバッグ

ここに画像の説明を挿入します
ここに画像の説明を挿入します
送信メッセージ
ここに画像の説明を挿入します
受信メッセージ メッセージ
ここに画像の説明を挿入します
には多くの情報が含まれていることがわかりますが、これは何を意味するのでしょうか? ここでは、SignalR の公式 Github リポジトリをチェックする必要があります。

SignalR ハブ プロトコル

タイプ=1

ここに画像の説明を挿入します

ただ翻訳してください

  • type: 1 の場合、メッセージの対話に使用されます。ネットワークの安定性を確保するために使用できるだけでなく、
  • invocationId: オプション、メッセージを区別するために使用される ID
  • target: トリガー文字列、MQTT のトークンに似ています
  • 引数: メッセージ ロード。MQTT のペイロードに似ています。
  • streamIds: 通信の一意の ID (オプション)

タイプ=6

タイプが 6 の場合、ネットワーク状況を ping するために使用されます。

ここに画像の説明を挿入します

Typeがその他の場合

Type には 1 ~ 9 の合計 9 つのメソッドがありますが、ここでは説明しません。

要約する

次に、ASP.NET Core のクライアント側とサーバー側の開発について学習します。ネット上にも情報が少ないので、自分で調べるしかありません。

おすすめ

転載: blog.csdn.net/qq_44695769/article/details/135615601