什么是 SignalR?
SignalR 是一個庫,可用于向應用程序添加實時 Web 功能。它提供了一個簡單的 API,用于創建可從服務器和客戶端調用的服務器到客戶端遠程過程調用 (RPC)。現在,SignalR 在 .NET 8.0 和 .NET 9.0 中支持修剪和原生 AOT。您可以在本文中了解更多關于SignalR 新功能的信息。
什么是修剪和本機 AOT?
AOT(提前編譯)功能允許您在運行應用程序之前將其編譯為原生代碼。這有助于提升性能并縮短啟動時間。Triming 功能允許您從應用程序中移除未使用的代碼,從而減小應用程序大小并提升性能。您可以在本文中了解更多關于原生 AOT 編譯的信息。
如何使用帶有修剪和本機 AOT 的 SignalR?
您可以使用以下命令創建 ASP.NET Core AOT 應用程序:
dotnet new webapiaot -n Acme.Sample
創建的應用程序使用CreateSlimBuilder方法為其創建精簡構建器。您可以使用CreateBuilder方法創建一個包含所有注冊服務的構建器。但是,使用CreateSlimBuilder方法部署應用程序更方便,因為它可以減小應用程序的大小。您可以了解更多關于CreateSlimBuilder 與 CreateBuilder 的區別。
將文件替換Program.cs為以下代碼:
using Microsoft.AspNetCore.SignalR;
using System.Text.Json.Serialization;
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddSignalR();
builder.Services.Configure<JsonHubProtocolOptions>(o =>
{
? ? o.PayloadSerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
app.MapHub<ChatHub>("/chatHub");
app.MapGet("/", () => Results.Content("""
<!DOCTYPE html>
<html>
<head>
? ? <title>SignalR Chat</title>
</head>
<body>
? ? <input id="userInput" placeholder="Enter your name" />
? ? <input id="messageInput" placeholder="Type a message" />
? ? <button οnclick="sendMessage()">Send</button>
? ? <ul id="messages"></ul>
? ? <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.7/signalr.min.js"></script>
? ? <script>
? ? ? ? const connection = new signalR.HubConnectionBuilder()
? ? ? ? ? ? .withUrl("/chatHub")
? ? ? ? ? ? .build();
? ? ? ? connection.on("ReceiveMessage", (user, message) => {
? ? ? ? ? ? const li = document.createElement("li");
? ? ? ? ? ? li.textContent = `${user}: ${message}`;
? ? ? ? ? ? document.getElementById("messages").appendChild(li);
? ? ? ? });
? ? ? ? async function sendMessage() {
? ? ? ? ? ? const user = document.getElementById("userInput").value;
? ? ? ? ? ? const message = document.getElementById("messageInput").value;
? ? ? ? ? ? await connection.invoke("SendMessage", user, message);
? ? ? ? }
? ? ? ? connection.start().catch(err => console.error(err));
? ? </script>
</body>
</html>
在部署應用程序之前,請確保使用 C++ 進行桌面開發如果您使用的是 Windows 操作系統,則已安裝在您的計算機上。有關更多詳細信息,您可以查看先決條件。
您可以使用以下命令部署應用程序:
dotnet publish -c Release
限制
由于我們使用的是 Native AOT,因此您應該注意一些限制:
????????? 僅支持 JSON 協議:SignalR 中的有效負載序列化僅支持 JSON 協議。您需要配置JsonHubProtocolOptions才能使用AppJsonSerializerContext進行序列化/反序列化。
????????? 反射:原生 AOT 不支持反射。您需要使用JsonSerializable屬性來指定需要序列化/反序列化的類型。在本例中,我們已將JsonSerializable屬性用于類string中的類型AppJsonSerializerContext。
更多詳細信息,可以查看Native AOT 的限制。
結論
在本文中,我們學習了如何在 .NET 8.0 和 .NET 9.0 中將 SignalR 與 Trimming 和 Native AOT 結合使用。我們創建了一個使用 SignalR 發送和接收消息的簡單聊天應用程序。我們還討論了使用 Native AOT 的局限性以及如何克服這些局限性。
更多信息可以參考微軟的官方文檔。
如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。