Skip to content

Commit 5d5181d

Browse files
committed
Use DefferedWebSocketResult to defer Task execution for NativeAOT context
1 parent e03c7fc commit 5d5181d

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

Net.Sdk.Web.Extensions/Net.Sdk.Web.Extensions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<Nullable>enable</Nullable>
77
<OutputType>Library</OutputType>
88
<IsPackable>true</IsPackable>
9-
<Version>0.8.9</Version>
9+
<Version>0.8.10</Version>
1010
<Authors>Alexandru Macocian</Authors>
1111
<PackageLicenseFile>LICENSE</PackageLicenseFile>
1212
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>

Net.Sdk.Web.Extensions/WebApplicationExtensions.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,22 @@ public static IEndpointConventionBuilder UseWebSocketRoute<TWebSocketRoute>(this
3434
where TWebSocketRoute : WebSocketRouteBase
3535
{
3636
app.ThrowIfNull();
37-
return app.MapGet(route, HandleWebSocketRoute<TWebSocketRoute>);
37+
return app.MapGet(route, HandleDeferredWebSocketRoute<TWebSocketRoute>);
3838
}
3939

40-
private static async Task<IResult> HandleWebSocketRoute<TWebSocketRoute>(HttpContext context, TWebSocketRoute route, ILogger<TWebSocketRoute> logger)
40+
private static DeferredWebSocketResult HandleDeferredWebSocketRoute<TWebSocketRoute>(HttpContext context, TWebSocketRoute route, ILogger<TWebSocketRoute> logger)
41+
where TWebSocketRoute : WebSocketRouteBase
42+
{
43+
return new DeferredWebSocketResult(route, HandleWebSocketRoute(context, route, logger));
44+
}
45+
46+
private static async Task HandleWebSocketRoute<TWebSocketRoute>(HttpContext context, TWebSocketRoute route, ILogger<TWebSocketRoute> logger)
4147
where TWebSocketRoute : WebSocketRouteBase
4248
{
4349
if (!context.WebSockets.IsWebSocketRequest)
4450
{
4551
logger.LogError("WebSocket request expected");
46-
return Results.BadRequest("WebSocket request expected");
52+
return;
4753
}
4854

4955
var routeFilters = GetRouteFilters<TWebSocketRoute>(context).ToList();
@@ -64,22 +70,18 @@ private static async Task<IResult> HandleWebSocketRoute<TWebSocketRoute>(HttpCon
6470
{
6571
var processingTask = new Func<Task>(() => ProcessWebSocketRequest(route, context));
6672
await BeginProcessingPipeline(actionExecutingContext, actionExecutedContext, processingTask);
67-
return Results.Empty;
6873
}
6974
catch (WebSocketException ex) when (ex.WebSocketErrorCode == WebSocketError.ConnectionClosedPrematurely)
7075
{
7176
logger.LogInformation("Websocket closed prematurely. Marking as closed");
72-
return Results.Empty;
7377
}
7478
catch (OperationCanceledException)
7579
{
7680
logger.LogInformation("Websocket closed prematurely. Marking as closed");
77-
return Results.Empty;
7881
}
7982
catch (Exception ex)
8083
{
8184
logger.LogError(ex, "Encountered exception while handling websocket. Closing");
82-
return Results.Empty;
8385
}
8486
finally
8587
{
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Core.Extensions;
2+
3+
namespace Net.Sdk.Web.Websockets;
4+
5+
public sealed class DeferredWebSocketResult(
6+
WebSocketRouteBase route,
7+
Task inner) : IResult
8+
{
9+
private readonly WebSocketRouteBase route = route.ThrowIfNull();
10+
private readonly Task inner = inner.ThrowIfNull();
11+
12+
public async Task ExecuteAsync(HttpContext httpContext)
13+
{
14+
try
15+
{
16+
await this.inner;
17+
}
18+
finally
19+
{
20+
await this.route.SocketClosed();
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)