Awaiting tasks returned from hubs and getting the actual result
This commit is contained in:
parent
b2108a6d65
commit
5e3be6e212
|
|
@ -13,8 +13,8 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
// REVIEW: Should there be an RPC package?
|
// REVIEW: Should there be an RPC package?
|
||||||
public class RpcEndpoint<T> : EndPoint where T : class
|
public class RpcEndpoint<T> : EndPoint where T : class
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, Func<Connection, InvocationDescriptor, InvocationResultDescriptor>> _callbacks
|
private readonly Dictionary<string, Func<Connection, InvocationDescriptor, Task<InvocationResultDescriptor>>> _callbacks
|
||||||
= new Dictionary<string, Func<Connection, InvocationDescriptor, InvocationResultDescriptor>>(StringComparer.OrdinalIgnoreCase);
|
= new Dictionary<string, Func<Connection, InvocationDescriptor, Task<InvocationResultDescriptor>>>(StringComparer.OrdinalIgnoreCase);
|
||||||
private readonly Dictionary<string, Type[]> _paramTypes = new Dictionary<string, Type[]>();
|
private readonly Dictionary<string, Type[]> _paramTypes = new Dictionary<string, Type[]>();
|
||||||
|
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
@ -61,10 +61,10 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
}
|
}
|
||||||
|
|
||||||
InvocationResultDescriptor result;
|
InvocationResultDescriptor result;
|
||||||
Func<Connection, InvocationDescriptor, InvocationResultDescriptor> callback;
|
Func<Connection, InvocationDescriptor, Task<InvocationResultDescriptor>> callback;
|
||||||
if (_callbacks.TryGetValue(invocationDescriptor.Method, out callback))
|
if (_callbacks.TryGetValue(invocationDescriptor.Method, out callback))
|
||||||
{
|
{
|
||||||
result = callback(connection, invocationDescriptor);
|
result = await callback(connection, invocationDescriptor);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
_logger.LogDebug("RPC method '{methodName}' is bound", methodName);
|
_logger.LogDebug("RPC method '{methodName}' is bound", methodName);
|
||||||
}
|
}
|
||||||
|
|
||||||
_callbacks[methodName] = (connection, invocationDescriptor) =>
|
_callbacks[methodName] = async (connection, invocationDescriptor) =>
|
||||||
{
|
{
|
||||||
var invocationResult = new InvocationResultDescriptor()
|
var invocationResult = new InvocationResultDescriptor()
|
||||||
{
|
{
|
||||||
|
|
@ -139,7 +139,18 @@ namespace Microsoft.AspNetCore.SignalR
|
||||||
.Zip(parameters, (a, p) => Convert.ChangeType(a, p.ParameterType))
|
.Zip(parameters, (a, p) => Convert.ChangeType(a, p.ParameterType))
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
invocationResult.Result = methodInfo.Invoke(value, args);
|
var result = methodInfo.Invoke(value, args);
|
||||||
|
var resultTask = result as Task;
|
||||||
|
if (resultTask != null)
|
||||||
|
{
|
||||||
|
await resultTask;
|
||||||
|
var property = resultTask.GetType().GetProperty("Result");
|
||||||
|
invocationResult.Result = property?.GetValue(resultTask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
invocationResult.Result = result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (TargetInvocationException ex)
|
catch (TargetInvocationException ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue