|
| 1 | +# ASP.NET Core updates in .NET 9 Release Candidate 1 |
| 2 | + |
| 3 | +Here's a summary of what's new in ASP.NET Core in this release: |
| 4 | + |
| 5 | +* [Improvements to SignalR distributed tracing](#improvements-to-signalr-distributed-tracing) |
| 6 | +* [Keep-alive timeout for WebSockets](#keep-alive-timeout-for-websockets) |
| 7 | +* [Keyed DI in middleware](#keyed-di-in-middleware) |
| 8 | +* [Override `InputNumber` type attribute](#override-inputnumber-type-attribute) |
| 9 | +* [Trust the ASP.NET Core HTTPS development certificate on Linux](#trust-the-aspnet-core-https-development-certificate-on-linux) |
| 10 | + |
| 11 | +ASP.NET Core updates in .NET 9 Release Candidate 1: |
| 12 | + |
| 13 | +* [Release notes](https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/rc1/aspnetcore.md) |
| 14 | +* [What's new in ASP.NET Core in .NET 9](https://learn.microsoft.com/aspnet/core/release-notes/aspnetcore-9.0) documentation. |
| 15 | +* [Breaking changes](https://docs.microsoft.com/dotnet/core/compatibility/9.0#aspnet-core) |
| 16 | +* [Roadmap](https://aka.ms/aspnet/roadmap) |
| 17 | + |
| 18 | +.NET 9 Release Candidate 1: |
| 19 | + |
| 20 | +* [Discussion](https://aka.ms/dotnet/9/rc1) |
| 21 | +* [Release notes](https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/rc1/README.md) |
| 22 | + |
| 23 | +## Improvements to SignalR distributed tracing |
| 24 | + |
| 25 | +.NET 9 preview 6 added [initial support for SignalR distributed tracing](https://github.com/dotnet/core/blob/main/release-notes/9.0/preview/preview6/aspnetcore.md#improved-distributed-tracing-for-signalr). RC1 improves SignalR tracing with new capabilities: |
| 26 | + |
| 27 | +* .NET SignalR client has an `ActivitySource` named "Microsoft.AspNetCore.SignalR.Client". Hub invocations now create a client span. Note that other SignalR clients, such as the JavaScript client, don't support tracing. This feature will be added to more clients in future releases. |
| 28 | +* Hub invocations from the client to the server now support [context propagation](https://opentelemetry.io/docs/concepts/context-propagation/). Propagating the trace context enables true distributed tracing. It's now possible to see invocations flow from the client to the server and back. |
| 29 | + |
| 30 | +Here's how these new activities look in the [.NET Aspire dashboard](https://learn.microsoft.com/dotnet/aspire/fundamentals/dashboard/overview?tabs=bash#standalone-mode): |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +## Keep-alive timeout for WebSockets |
| 35 | + |
| 36 | +The [WebSockets middleware](https://learn.microsoft.com/aspnet/core/fundamentals/websockets#configure-the-middleware) can now be configured with keep-alive timeouts. |
| 37 | + |
| 38 | +The keep-alive timeout aborts the WebSocket connection and throws an exception from `WebSocket.ReceiveAsync` if both of the following conditions are met: |
| 39 | + |
| 40 | +* The server sends a ping frame using the websocket protocol. |
| 41 | +* The client doesn't reply with a pong frame within the specified timeout. |
| 42 | + |
| 43 | +The server automatically sends the ping frame and configures it with `KeepAliveInterval`. |
| 44 | + |
| 45 | +The keep-alive timeout setting is useful for detecting connections that might be slow or ungracefully disconnected. |
| 46 | + |
| 47 | +The keep-alive timeout can be configured globally for the WebSocket middleware: |
| 48 | + |
| 49 | +```csharp |
| 50 | +app.UseWebSockets(new WebSocketOptions { KeepAliveTimeout = TimeSpan.FromSeconds(15) }); |
| 51 | +``` |
| 52 | + |
| 53 | +Or configured per accepted WebSocket: |
| 54 | + |
| 55 | +```csharp |
| 56 | +app.Run(async (context) => |
| 57 | +{ |
| 58 | + using var webSocket = await context.WebSockets.AcceptWebSocketAsync( |
| 59 | + new WebSocketAcceptContext { KeepAliveTimeout = TimeSpan.FromSeconds(15) }); |
| 60 | + |
| 61 | + // ... |
| 62 | +} |
| 63 | +``` |
| 64 | + |
| 65 | +## Keyed DI in middleware |
| 66 | + |
| 67 | +Middleware now supports [Keyed DI](https://learn.microsoft.com/aspnet/core/fundamentals/dependency-injection#keyed-services) in both the constructor and the `Invoke`/`InvokeAsync` method. |
| 68 | +
|
| 69 | +```csharp |
| 70 | +var builder = WebApplication.CreateBuilder(args); |
| 71 | +builder.Services.AddKeyedSingleton<MySingletonClass>("test"); |
| 72 | +builder.Services.AddKeyedScoped<MyScopedClass>("test2"); |
| 73 | + |
| 74 | +var app = builder.Build(); |
| 75 | +app.UseMiddleware<MyMiddleware>(); |
| 76 | +app.Run(); |
| 77 | + |
| 78 | +internal class MyMiddleware |
| 79 | +{ |
| 80 | + private readonly RequestDelegate _next; |
| 81 | + |
| 82 | + public MyMiddleware(RequestDelegate next, [FromKeyedServices("test")] MySingletonClass service) |
| 83 | + { |
| 84 | + _next = next; |
| 85 | + } |
| 86 | + |
| 87 | + public Task Invoke(HttpContext context, [FromKeyedServices("test2")] MyScopedClass scopedService) => _next(context); |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +See [Write custom ASP.NET Core middleware](https://learn.microsoft.com/aspnet/core/fundamentals/middleware/write) for more information on writing custom middleware. |
| 92 | + |
| 93 | +Thank you [@NicoBrabers](https://github.com/NicoBrabers) for this contribution! |
| 94 | + |
| 95 | +## Override `InputNumber` type attribute |
| 96 | + |
| 97 | +The `InputNumber` component now supports overriding the type attribute. For example, you can specify `type="range"` to create a range input that supports model binding and form validation: |
| 98 | + |
| 99 | +```razor |
| 100 | +<InputNumber type="range" min="1" max="10" step="1" @bind-Value="Model.Rating" /> |
| 101 | +``` |
| 102 | + |
| 103 | +Thank you [@MattyLeslie](https://github.com/MattyLeslie) for the contribution! |
| 104 | + |
| 105 | +## Trust the ASP.NET Core HTTPS development certificate on Linux |
| 106 | + |
| 107 | +On Ubuntu and Fedora based Linux distros, `dotnet dev-certs https --trust` will now configure ASP.NET Core HTTPS development certificate as a trusted certificate for Chromium (Edge, Chrome, Chromium, etc) and Mozilla (Firefox, etc) browsers, as well as for use with .NET APIs (`HttpClient`, etc). Previously, `--trust` only worked on Windows and macOS. Certificate trust is applied per-user. |
| 108 | + |
| 109 | +To establish trust in OpenSSL, the tool puts the certificate in *~/.aspnet/dev-certs/trust*, runs a simplified version of OpenSSL's c_rehash tool on the directory, and asks the user to update the `SSL_CERT_DIR` environment variable accordingly. |
| 110 | + |
| 111 | +To establish trust in dotnet, the tool puts the certificate in the *My/Root* certificate store. |
| 112 | + |
| 113 | +To establish trust in NSS databases (nssdb), the tool searches the home directory for Firefox profiles, *~/.pki/nssdb*, and *~/snap/chromium/current/.pki/nssdb*. For each one found, the tool adds an entry to the nssdb. |
| 114 | + |
| 115 | +## Community contributors |
| 116 | + |
| 117 | +Thank you contributors! ❤️ |
| 118 | + |
| 119 | +* [@martincostello](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3Amartincostello) |
| 120 | +* [@NoahMoritz](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3ANoahMoritz) |
| 121 | +* [@ladeak](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3Aladeak) |
| 122 | +* [@voroninp](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3Avoroninp) |
| 123 | +* [@MauriceChocoSwiss](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3AMauriceChocoSwiss) |
| 124 | +* [@NicoBrabers](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3ANicoBrabers) |
| 125 | +* [@MattyLeslie](https://github.com/dotnet/aspnetcore/pulls?q=is%3Apr+is%3Amerged+milestone%3A9.0-rc1+author%3AMattyLeslie) |
0 commit comments