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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值