1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . Linq ;
3
4
using System . Threading . Tasks ;
4
5
using System . Web ;
13
14
namespace WampSharp . AspNet . WebSockets . Server
14
15
{
15
16
/// <exclude />
16
- public sealed class AspNetWebsocketTransport : WebSocketTransport < WebSocketData >
17
+ public sealed class AspNetWebSocketTransport : WebSocketTransport < WebSocketData >
17
18
{
18
19
private readonly string mUrl ;
20
+ private readonly object mLock = new object ( ) ;
19
21
private Route mRoute ;
20
22
21
23
/// <exclude />
22
- public AspNetWebsocketTransport ( string url ,
24
+ public AspNetWebSocketTransport ( string url ,
23
25
ICookieAuthenticatorFactory authenticatorFactory = null )
24
26
: base ( authenticatorFactory )
25
27
{
@@ -29,9 +31,13 @@ public AspNetWebsocketTransport(string url,
29
31
/// <exclude />
30
32
public override void Dispose ( )
31
33
{
32
- if ( mRoute != null )
34
+ lock ( mLock )
33
35
{
34
- RouteTable . Routes . Remove ( mRoute ) ;
36
+ if ( mRoute != null )
37
+ {
38
+ RouteTable . Routes . Remove ( mRoute ) ;
39
+ mRoute = null ;
40
+ }
35
41
}
36
42
}
37
43
@@ -67,9 +73,12 @@ protected override IWampConnection<TMessage> CreateTextConnection<TMessage>
67
73
/// <exclude />
68
74
public override void Open ( )
69
75
{
70
- // Side effects, here we come :)
71
- mRoute = new Route ( mUrl , new RouteHandler ( this ) ) ;
72
- RouteTable . Routes . Add ( mUrl , mRoute ) ;
76
+ lock ( mLock )
77
+ {
78
+ // Side effects, here we come :)
79
+ mRoute = new Route ( mUrl , new RouteHandler ( this ) ) ;
80
+ RouteTable . Routes . Add ( mUrl , mRoute ) ;
81
+ }
73
82
}
74
83
75
84
private void ProcessRequest ( HttpContext context )
@@ -109,16 +118,16 @@ protected override void OpenConnection<TMessage>(WebSocketData original, IWampCo
109
118
{
110
119
WebSocketWrapperConnection < TMessage > casted = connection as WebSocketWrapperConnection < TMessage > ;
111
120
112
- Task task = Task . Run ( casted . RunAsync ) ;
121
+ Task task = Task . Run ( ( Func < Task > ) casted . RunAsync ) ;
113
122
114
123
original . ReadTask = task ;
115
124
}
116
125
117
- public class RouteHandler : IRouteHandler , IHttpHandler
126
+ private class RouteHandler : IRouteHandler , IHttpHandler
118
127
{
119
- private readonly AspNetWebsocketTransport mParent ;
128
+ private readonly AspNetWebSocketTransport mParent ;
120
129
121
- public RouteHandler ( AspNetWebsocketTransport parent )
130
+ public RouteHandler ( AspNetWebSocketTransport parent )
122
131
{
123
132
mParent = parent ;
124
133
}
0 commit comments