File tree 6 files changed +67
-11
lines changed
AspNetCore/src/AspNetCore/Subscriptions
6 files changed +67
-11
lines changed Original file line number Diff line number Diff line change 3
3
using System . Collections . Generic ;
4
4
using System . Diagnostics . CodeAnalysis ;
5
5
using System . Linq ;
6
+ using System . Net . WebSockets ;
6
7
using System . Threading ;
7
8
using System . Threading . Tasks ;
8
9
using HotChocolate . AspNetCore . Subscriptions . Messages ;
@@ -30,15 +31,22 @@ public async Task ProcessAsync(
30
31
ReadOnlySequence < byte > slice ,
31
32
CancellationToken cancellationToken )
32
33
{
33
- if ( TryParseMessage ( slice , out OperationMessage ? message ) )
34
+ try
34
35
{
35
- await HandleMessageAsync ( connection , message , cancellationToken ) ;
36
+ if ( TryParseMessage ( slice , out OperationMessage ? message ) )
37
+ {
38
+ await HandleMessageAsync ( connection , message , cancellationToken ) ;
39
+ }
40
+ else
41
+ {
42
+ await connection . SendAsync (
43
+ KeepConnectionAliveMessage . Default ,
44
+ CancellationToken . None ) ;
45
+ }
36
46
}
37
- else
47
+ catch ( WebSocketException )
38
48
{
39
- await connection . SendAsync (
40
- KeepConnectionAliveMessage . Default ,
41
- CancellationToken . None ) ;
49
+ // we will just stop receiving
42
50
}
43
51
}
44
52
Original file line number Diff line number Diff line change 1
1
using System ;
2
+ using System . Net . WebSockets ;
2
3
using System . Threading ;
3
4
using System . Threading . Tasks ;
4
5
using HotChocolate . AspNetCore . Subscriptions . Messages ;
@@ -52,6 +53,10 @@ await _connection.SendAsync(
52
53
{
53
54
// the message processing was canceled.
54
55
}
56
+ catch ( WebSocketException )
57
+ {
58
+ // we will just stop receiving
59
+ }
55
60
}
56
61
}
57
62
}
Original file line number Diff line number Diff line change 1
1
using System ;
2
2
using System . Buffers ;
3
3
using System . IO . Pipelines ;
4
+ using System . Net . WebSockets ;
4
5
using System . Threading ;
5
6
using System . Threading . Tasks ;
6
7
@@ -67,6 +68,10 @@ await _pipeline.ProcessAsync(
67
68
}
68
69
}
69
70
catch ( OperationCanceledException ) when ( cancellationToken . IsCancellationRequested ) { }
71
+ catch ( WebSocketException )
72
+ {
73
+ // we will just stop receiving
74
+ }
70
75
finally
71
76
{
72
77
// reader should be completed always, so that related pipe writer can
Original file line number Diff line number Diff line change @@ -63,7 +63,7 @@ public Task SendAsync(
63
63
{
64
64
WebSocket ? webSocket = _webSocket ;
65
65
66
- if ( _disposed || webSocket == null )
66
+ if ( _disposed || webSocket == null || webSocket . State != WebSocketState . Open )
67
67
{
68
68
return Task . CompletedTask ;
69
69
}
@@ -95,6 +95,11 @@ public async Task ReceiveAsync(
95
95
96
96
if ( success )
97
97
{
98
+ if ( webSocket . State != WebSocketState . Open )
99
+ {
100
+ break ;
101
+ }
102
+
98
103
try
99
104
{
100
105
socketResult = await webSocket . ReceiveAsync ( buffer , cancellationToken ) ;
@@ -122,6 +127,10 @@ public async Task ReceiveAsync(
122
127
{
123
128
// we will just stop receiving
124
129
}
130
+ catch ( WebSocketException )
131
+ {
132
+ // we will just stop receiving
133
+ }
125
134
}
126
135
127
136
public async Task CloseAsync (
@@ -133,7 +142,7 @@ public async Task CloseAsync(
133
142
{
134
143
WebSocket ? webSocket = _webSocket ;
135
144
136
- if ( _disposed || Closed || webSocket is null )
145
+ if ( _disposed || Closed || webSocket is null || webSocket . State != WebSocketState . Open )
137
146
{
138
147
return ;
139
148
}
Original file line number Diff line number Diff line change 2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
4
using System . Threading ;
5
+ using System . Threading . Channels ;
5
6
using System . Threading . Tasks ;
6
7
using HotChocolate . Types ;
7
8
@@ -34,6 +35,10 @@ private async ValueTask TryExecuteAndCompleteAsync(CancellationToken cancellatio
34
35
CompleteValue ( success , cancellationToken ) ;
35
36
}
36
37
}
38
+ catch ( ObjectDisposedException )
39
+ {
40
+ IsCanceled = true ;
41
+ }
37
42
catch
38
43
{
39
44
IsCanceled = true ;
@@ -52,10 +57,28 @@ private async ValueTask TryExecuteAndCompleteAsync(CancellationToken cancellatio
52
57
}
53
58
else
54
59
{
55
- _operationContext . Execution . TaskStats . TaskCompleted ( ) ;
60
+ try
61
+ {
62
+ _operationContext . Execution . TaskStats . TaskCompleted ( ) ;
63
+ }
64
+ catch ( ChannelClosedException )
65
+ {
66
+ }
67
+ catch ( ObjectDisposedException )
68
+ {
69
+ }
56
70
}
57
71
58
- _operationContext . Execution . TaskPool . Return ( this ) ;
72
+ try
73
+ {
74
+ _operationContext . Execution . TaskPool . Return ( this ) ;
75
+ }
76
+ catch ( ChannelClosedException )
77
+ {
78
+ }
79
+ catch ( ObjectDisposedException )
80
+ {
81
+ }
59
82
}
60
83
}
61
84
Original file line number Diff line number Diff line change @@ -110,7 +110,13 @@ private async ValueTask ExecuteAsync(CancellationToken cancellationToken)
110
110
finally
111
111
{
112
112
IsCanceled = cancellationToken . IsCancellationRequested ;
113
- _context . Completed ( ) ;
113
+ try
114
+ {
115
+ _context . Completed ( ) ;
116
+ }
117
+ catch ( ObjectDisposedException )
118
+ {
119
+ }
114
120
}
115
121
}
116
122
}
You can’t perform that action at this time.
0 commit comments