.NET 9.0 SignalR 支持修剪和原生 AOT

什么是 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 的局限性以及如何克服这些局限性。

更多信息可以参考微软的官方文档

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
csdn_aspnet6 小时前
使用 .NET Core 7 SignalR 构建实时聊天应用程序
signalr·.net7
csdn_aspnet16 小时前
升级到 .NET 9 分步指南
.net9
小书房10 天前
Android的Dalvik和ART
android·aot·jit·art·dalvik
包达叔12 天前
Admin.Net中的消息通信SignalR解释
signalr
带刺的坐椅25 天前
启用 Java AOT 编译打包 Solon 项目(Solon AOT)
java·aot·solon·打包
ChaITSimpleLove1 个月前
详解 .net9 内置 Lock 对象,更加现代化和灵活可控的锁对象
线程安全·lock·.net9·现代化锁·灵活可控
在未来等你1 个月前
互联网大厂Java求职面试:Spring Boot 3.2+自动配置原理、AOT编译及原生镜像
java·spring boot·graalvm·aot·虚拟线程
csdn_aspnet2 个月前
使用 SignalR 在 .NET Core 8 最小 API 中构建实时通知
signalr·.net8
hez20102 个月前
用 .NET NativeAOT 构建完全 distroless 的静态链接应用
c#·.net·aot·.net core·native