什么是 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 的局限性以及如何克服这些局限性。
更多信息可以参考微软的官方文档。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。