diff --git a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md new file mode 100644 index 0000000000..539ebef42c --- /dev/null +++ b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/Post.md @@ -0,0 +1,93 @@ +# ASP.NET Core SignalR New Features (Summary) + +In this article, I'll highlight .**NET 9's SignalR updates** for ASP.NET Core 9.0. + +![cover](cover.png) + +## Hub Accept a Base Class + +In this version, your `Hub` class can now get a base class of a polymorphic class. As you see in the below example; I can send `Animal` to my Hub method. Before we could only pass the derived class like `Cat` and `Dog`. + +```csharp +/*** My Base Class is Animal ***/ +[JsonPolymorphic] +[JsonDerivedType(typeof(Cat), nameof(Cat))] +[JsonDerivedType(typeof(Dog), nameof(Dog))] +private class Animal +{ + public string Name { get; set; } +} + +/*** CAT derived from Animal ***/ +private class Cat : Animal +{ + public CatTypes CatType { get; set; } +} + +/*** DOG derived from Animal ***/ +private class Dog : Animal +{ + public DogTypes DogType { get; set; } +} + + +public class MyHub : Hub +{ + /*** We can use the base type Animal here ***/ + public void Process(Animal animal) + { + if (animal is Cat) { ... } + else if (animal is Dog) { ... } + } +} + +``` + + + +## Better Diagnostics and Telemetry + +SignalR now integrates more deeply with the .NET Activity API, which is commonly used for distributed tracing. This enhancement is mostly implemented for better monitoring in [.NET Aspire Dashboard](https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/overview?tabs=bash#using-the-dashboard-with-net-aspire-projects). To support the improved telemetry feature: + +1- Add these packages to your`csproj`: + +```xml + + + +``` + +2- Add the following startup code to your host project: + +```csharp +builder.Services.AddSignalR(); +/* After AddSignalR use AddOpenTelemetry() */ +builder + .Services + .AddOpenTelemetry() + .WithTracing(tracing => + { + if (builder.Environment.IsDevelopment()) + { + tracing.SetSampler(new AlwaysOnSampler()); //for dev env monitor all traces + } + + tracing.AddAspNetCoreInstrumentation(); + tracing.AddSource("Microsoft.AspNetCore.SignalR.Server"); + }); + +builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter()); +``` + +And you'll see the SignalR Hub calls at the Aspire Dashboard: + +![image-20241002183315780](C:\Users\alper\AppData\Roaming\Typora\typora-user-images\image-20241002183315780.png) + + + +## Trimming and Native AOT Support + +In this version, **trimming** and native **Ahead Of Time** compilation are **supported**. It'll improve your app's performance. To support AOT, your serialization object needs to be JSON and you must use the `System.Text.Json` Source Generator. Also on the server side, [you shouldn't use](https://github.com/dotnet/aspnetcore/issues/56179) `IAsyncEnumerable` and `ChannelReader` where `T` is a ValueType (`struct`) for Hub method arguments. Besides, [Strongly typed hubs](https://learn.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-8.0#strongly-typed-hubs) aren't supported with Native AOT (`PublishAot`). And you should use only `Task`, `Task`, `ValueTask`, `ValueTask` for `async` return types. + + + diff --git a/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/cover.png b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/cover.png new file mode 100644 index 0000000000..d5e783520a Binary files /dev/null and b/docs/en/Community-Articles/2024-10-01-SignalR-9-New-Features/cover.png differ