@@ -21,8 +21,8 @@ internal class WampCalleeInvocationHandler<TMessage> : IWampCalleeInvocationHand
2121 private readonly IDictionary < IWampCaller , ICollection < WampRpcInvocation > > mCallerToInvocations =
2222 new Dictionary < IWampCaller , ICollection < WampRpcInvocation > > ( ) ;
2323
24- private readonly IDictionary < IWampRawRpcOperationRouterCallback , WampRpcInvocation > mCallbackToInvocation =
25- new Dictionary < IWampRawRpcOperationRouterCallback , WampRpcInvocation > ( ) ;
24+ private readonly IDictionary < WampCallerRequestKey , WampRpcInvocation > mCallbackToInvocation =
25+ new Dictionary < WampCallerRequestKey , WampRpcInvocation > ( ) ;
2626
2727 private readonly object mLock = new object ( ) ;
2828 private readonly TMessage mEmptyDetails ;
@@ -63,7 +63,7 @@ public long RegisterInvocation(RemoteWampCalleeDetails operation, IWampRawRpcOpe
6363
6464 if ( properties . HelloDetails ? . Roles ? . Callee ? . Features ? . CallCanceling == true )
6565 {
66- mCallbackToInvocation . Add ( callback , invocation ) ;
66+ mCallbackToInvocation . Add ( GetRequestKey ( caller , callback . RequestId ) , invocation ) ;
6767 }
6868
6969 return invocationId ;
@@ -83,12 +83,11 @@ private static IWampCaller GetCaller(IWampRawRpcOperationRouterCallback callback
8383
8484 public void Cancel ( IWampCaller caller , long requestId , CancelOptions options )
8585 {
86-
87- WampRpcOperationCallback callback = new WampRpcOperationCallback ( caller , requestId ) ;
86+ WampCallerRequestKey key = GetRequestKey ( caller , requestId ) ;
8887
8988 lock ( mLock )
9089 {
91- if ( mCallbackToInvocation . TryGetValue ( callback , out WampRpcInvocation invocation ) )
90+ if ( mCallbackToInvocation . TryGetValue ( key , out WampRpcInvocation invocation ) )
9291 {
9392 IWampCallee callee = invocation . Operation . Callee ;
9493
@@ -97,6 +96,13 @@ public void Cancel(IWampCaller caller, long requestId, CancelOptions options)
9796 }
9897 }
9998
99+ private static WampCallerRequestKey GetRequestKey ( IWampCaller caller , long requestId )
100+ {
101+ IWampClientProperties wampClientProperties = caller as IWampClientProperties ;
102+ WampCallerRequestKey callback = new WampCallerRequestKey ( wampClientProperties . Session , requestId ) ;
103+ return callback ;
104+ }
105+
100106 private void RegisterDisconnectionNotifier ( IWampRawRpcOperationRouterCallback callback )
101107 {
102108
@@ -247,7 +253,7 @@ private void UnregisterInvocation(WampRpcInvocation invocation)
247253 }
248254
249255 mOperationToInvocations . Remove ( invocation . Operation , invocation ) ;
250- mCallbackToInvocation . Remove ( invocation . Callback ) ;
256+ mCallbackToInvocation . Remove ( GetRequestKey ( caller , invocation . Callback . RequestId ) ) ;
251257 }
252258 }
253259
@@ -276,5 +282,38 @@ private WampRpcInvocation GetInvocation(long requestId, YieldOptions options)
276282
277283 return null ;
278284 }
285+
286+ private class WampCallerRequestKey
287+ {
288+ public WampCallerRequestKey ( long session , long requestId )
289+ {
290+ Session = session ;
291+ RequestId = requestId ;
292+ }
293+
294+ public long Session { get ; }
295+ public long RequestId { get ; }
296+
297+ protected bool Equals ( WampCallerRequestKey other )
298+ {
299+ return Session == other . Session && RequestId == other . RequestId ;
300+ }
301+
302+ public override bool Equals ( object obj )
303+ {
304+ if ( ReferenceEquals ( null , obj ) ) return false ;
305+ if ( ReferenceEquals ( this , obj ) ) return true ;
306+ if ( obj . GetType ( ) != this . GetType ( ) ) return false ;
307+ return Equals ( ( WampCallerRequestKey ) obj ) ;
308+ }
309+
310+ public override int GetHashCode ( )
311+ {
312+ unchecked
313+ {
314+ return ( Session . GetHashCode ( ) * 397 ) ^ RequestId . GetHashCode ( ) ;
315+ }
316+ }
317+ }
279318 }
280319}
0 commit comments