示例#1
0
        public async Task RequestVMAsync(string vmId, object vmArg)
        {
            object data = NormalizeType(vmArg);

            try
            {
                _callerContext = Context;
                _hubContext    = new DotNetifyHubContext(_callerContext, nameof(IDotNetifyHubMethod.Request_VM), vmId, data, null, Principal);
                await _hubPipeline.RunMiddlewaresAsync(_hubContext, async ctx =>
                {
                    Principal        = ctx.Principal;
                    string groupName = await VMController.OnRequestVMAsync(Context.ConnectionId, ctx.VMId, ctx.Data);

                    // A multicast view model may be assigned to a SignalR group. If so, add the connection to the group.
                    if (!string.IsNullOrEmpty(groupName))
                    {
                        await _globalHubContext.Groups.AddToGroupAsync(Context.ConnectionId, groupName);
                    }
                });
            }
            catch (Exception ex)
            {
                var finalEx = await _hubPipeline.RunExceptionMiddlewareAsync(Context, ex);

                if (finalEx is OperationCanceledException == false)
                {
                    await ResponseVMAsync(Context.ConnectionId, vmId, SerializeException(finalEx));
                }
            }
        }
示例#2
0
        public async Task <string> Request_VM(
            string vmId,
            [FromQuery] string vmArg,
            [FromServices] IVMFactory vmFactory,
            [FromServices] IHubServiceProvider hubServiceProvider,
            [FromServices] IVMServiceScopeFactory serviceScopeFactory,
            [FromServices] IHubPipeline hubPipeline,
            [FromServices] IPrincipalAccessor principalAccessor
            )
        {
            var taskCompletionSource = new TaskCompletionSource <string>(TaskCreationOptions.RunContinuationsAsynchronously);

            Task responseVM(string arg1, string arg2, string arg3)
            {
                taskCompletionSource.TrySetResult(arg3);
                return(Task.CompletedTask);
            }

            var vmController = new VMController(responseVM, vmFactory, serviceScopeFactory.CreateScope())
            {
                ResponseVMFilter = CreateRespondingVMFilter(hubPipeline, vmId, vmArg)
            };

            var httpCallerContext = InitializeContext(vmController, hubServiceProvider, principalAccessor);
            var connectionId      = httpCallerContext.ConnectionId;

            try
            {
                var hubContext = new DotNetifyHubContext(httpCallerContext, nameof(Request_VM), vmId, vmArg, BuildHeaders(), httpCallerContext.User);
                vmController.RequestVMFilter = CreateVMFilter(hubContext, hubPipeline);

                await hubPipeline.RunMiddlewaresAsync(hubContext, async ctx =>
                {
                    await vmController.OnRequestVMAsync(connectionId, ctx.VMId, ctx.Data);
                    vmController.Dispose();
                });
            }
            catch (Exception ex)
            {
                var finalEx = await hubPipeline.RunExceptionMiddlewareAsync(httpCallerContext, ex);

                if (finalEx is OperationCanceledException == false)
                {
                    taskCompletionSource.TrySetResult(DotNetifyHub.SerializeException(finalEx));
                }
            }

            return(await taskCompletionSource.Task);
        }