From a491addcb82cd06c3029a6f57ccd2aa149e56ed9 Mon Sep 17 00:00:00 2001 From: Elad Zelingher Date: Tue, 14 Mar 2023 22:17:57 -0400 Subject: [PATCH] Fixing #347? --- .../Rpc/Dealer/WampCalleeInvocationHandler.cs | 53 ++++++++++++++++--- .../IWampRawRpcOperationClientCallback.cs | 1 + 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/netstandard/WampSharp/WAMP2/V2/Rpc/Dealer/WampCalleeInvocationHandler.cs b/src/netstandard/WampSharp/WAMP2/V2/Rpc/Dealer/WampCalleeInvocationHandler.cs index 34247e98e..ef343991c 100644 --- a/src/netstandard/WampSharp/WAMP2/V2/Rpc/Dealer/WampCalleeInvocationHandler.cs +++ b/src/netstandard/WampSharp/WAMP2/V2/Rpc/Dealer/WampCalleeInvocationHandler.cs @@ -21,8 +21,8 @@ internal class WampCalleeInvocationHandler : IWampCalleeInvocationHand private readonly IDictionary> mCallerToInvocations = new Dictionary>(); - private readonly IDictionary mCallbackToInvocation = - new Dictionary(); + private readonly IDictionary mCallbackToInvocation = + new Dictionary(); private readonly object mLock = new object(); private readonly TMessage mEmptyDetails; @@ -63,7 +63,7 @@ public long RegisterInvocation(RemoteWampCalleeDetails operation, IWampRawRpcOpe if (properties.HelloDetails?.Roles?.Callee?.Features?.CallCanceling == true) { - mCallbackToInvocation.Add(callback, invocation); + mCallbackToInvocation.Add(GetRequestKey(caller, callback.RequestId), invocation); } return invocationId; @@ -83,12 +83,11 @@ private static IWampCaller GetCaller(IWampRawRpcOperationRouterCallback callback public void Cancel(IWampCaller caller, long requestId, CancelOptions options) { - - WampRpcOperationCallback callback = new WampRpcOperationCallback(caller, requestId); + WampCallerRequestKey key = GetRequestKey(caller, requestId); lock (mLock) { - if (mCallbackToInvocation.TryGetValue(callback, out WampRpcInvocation invocation)) + if (mCallbackToInvocation.TryGetValue(key, out WampRpcInvocation invocation)) { IWampCallee callee = invocation.Operation.Callee; @@ -97,6 +96,13 @@ public void Cancel(IWampCaller caller, long requestId, CancelOptions options) } } + private static WampCallerRequestKey GetRequestKey(IWampCaller caller, long requestId) + { + IWampClientProperties wampClientProperties = caller as IWampClientProperties; + WampCallerRequestKey callback = new WampCallerRequestKey(wampClientProperties.Session, requestId); + return callback; + } + private void RegisterDisconnectionNotifier(IWampRawRpcOperationRouterCallback callback) { @@ -247,7 +253,7 @@ private void UnregisterInvocation(WampRpcInvocation invocation) } mOperationToInvocations.Remove(invocation.Operation, invocation); - mCallbackToInvocation.Remove(invocation.Callback); + mCallbackToInvocation.Remove(GetRequestKey(caller, invocation.Callback.RequestId)); } } @@ -276,5 +282,38 @@ private WampRpcInvocation GetInvocation(long requestId, YieldOptions options) return null; } + + private class WampCallerRequestKey + { + public WampCallerRequestKey(long session, long requestId) + { + Session = session; + RequestId = requestId; + } + + public long Session { get; } + public long RequestId { get; } + + protected bool Equals(WampCallerRequestKey other) + { + return Session == other.Session && RequestId == other.RequestId; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((WampCallerRequestKey)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (Session.GetHashCode() * 397) ^ RequestId.GetHashCode(); + } + } + } } } \ No newline at end of file diff --git a/src/netstandard/WampSharp/WAMP2/V2/Rpc/Interfaces/IWampRawRpcOperationClientCallback.cs b/src/netstandard/WampSharp/WAMP2/V2/Rpc/Interfaces/IWampRawRpcOperationClientCallback.cs index a7c21d047..2225637b4 100644 --- a/src/netstandard/WampSharp/WAMP2/V2/Rpc/Interfaces/IWampRawRpcOperationClientCallback.cs +++ b/src/netstandard/WampSharp/WAMP2/V2/Rpc/Interfaces/IWampRawRpcOperationClientCallback.cs @@ -9,6 +9,7 @@ namespace WampSharp.V2.Rpc /// public interface IWampRawRpcOperationRouterCallback : IWampRawRpcOperationCallback { + public long RequestId { get; } } ///