signalR示例

1.安装dotnet环境

2.创建dotnet项目

dotnet new webapp -o SignalRChat

cd SignalRChat

添加signalR客户端

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

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

使用 LibMan 运行以下命令,以获取 SignalR 客户端库。 可能需要几秒钟才能显示输出。

libman install @microsoft/signalr@latest -p unpkg -d wwwroot/js/signalr --files dist/browser/signalr.js

在 SignalRChat 项目文件夹中,创建 Hubs 文件夹。

Hubs 文件夹中,使用以下代码创建 ChatHub 类:

using Microsoft.AspNetCore.SignalR;

namespace SignalRChat.Hubs {    

public class ChatHub : Hub    {        

public async Task SendMessage(string user, string message)        {            

await Clients.All.SendAsync("ReceiveMessage", user, message);     

   }  

  }

}

将如下代码替换到Program.cs文件

using SignalRChat.Hubs;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
   app.UseExceptionHandler("/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.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chatHub");

app.Run();

添加客户端代码,使用以下代码替换 Pages/Index.cshtml 中的内容:

@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>

wwwroot/js 文件夹中,使用以下代码创建 chat.js 文件:

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

运行:指定域名和端口(否则只能localhost访问)

dotnet run --urls=http://c.threefishes.cn:5155/

从地址栏复制 URL,打开另一个浏览器实例或选项卡,并在地址栏中粘贴该 URL。

选择任一浏览器,输入名称和消息,然后选择“发送消息”按钮。

两个页面上立即显示名称和消息。

--------------------------------------------------

如果前端错误则可以执行如下命令

dotnet dev-certs https --clean

dotnet dev-certs https --trust