Skip to content

Commit a491add

Browse files
committed
Fixing #347?
1 parent 5455b94 commit a491add

File tree

2 files changed

+47
-7
lines changed

2 files changed

+47
-7
lines changed

src/netstandard/WampSharp/WAMP2/V2/Rpc/Dealer/WampCalleeInvocationHandler.cs

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/netstandard/WampSharp/WAMP2/V2/Rpc/Interfaces/IWampRawRpcOperationClientCallback.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace WampSharp.V2.Rpc
99
/// </summary>
1010
public interface IWampRawRpcOperationRouterCallback : IWampRawRpcOperationCallback<YieldOptions>
1111
{
12+
public long RequestId { get; }
1213
}
1314

1415
/// <summary>

0 commit comments

Comments
 (0)