示例#1
0
        public async Task <string> Request_VM(
            string vmId,
            [FromQuery] string vmArg,
            [FromServices] WebApiVMControllerFactory vmControllerFactory,
            [FromServices] IHubServiceProvider hubServiceProvider,
            [FromServices] IPrincipalAccessor principalAccessor,
            [FromServices] IHubPipeline hubPipeline,
            [FromServices] IDotNetifyHubResponseManager hubResponseManager

            )
        {
            var hub = CreateHubHandler(vmControllerFactory, hubServiceProvider, principalAccessor, hubPipeline, hubResponseManager, nameof(IDotNetifyHubMethod.Request_VM), vmId, vmArg);

            try
            {
                await hub.RequestVMAsync(vmId, vmArg);

                _taskCompletionSource.TrySetResult(_responses.LastOrDefault());
                _responses.Clear();
            }
            catch (Exception ex)
            {
                _taskCompletionSource.TrySetResult(ex.Serialize());
            }

            return(await _taskCompletionSource.Task);
        }
示例#2
0
        /// <summary>
        /// Creates a dotNetify hub that uses HTTP context for its hub context, and sets the response callback to a local function.
        /// </summary>
        /// <param name="vmControllerFactory">Factory of view model controllers.</param>
        /// <param name="serviceProvider">Allows to provide scoped service provider for the view models.</param>
        /// <param name="principalAccessor">Allows to pass the hub principal.</param>
        /// <param name="hubPipeline">Manages middlewares and view model filters.</param>
        /// <param name="hubResponseFactory">Factory of objects to send responses back to hub clients.</param>
        /// <param name="callType">Hub call type.</param>
        /// <param name="vmId">Identifies the view model.</param>
        /// <param name="data">View model data.</param>
        /// <returns>Hub instance.</returns>
        private IDotNetifyHubHandler CreateHubHandler(
            IVMControllerFactory vmControllerFactory,
            IHubServiceProvider hubServiceProvider,
            IPrincipalAccessor principalAccessor,
            IHubPipeline hubPipeline,
            IDotNetifyHubResponseManager hubResponseManager,
            string callType,
            string vmId,
            object data = null)
        {
            var httpCallerContext = new HttpCallerContext(HttpContext);

            if (principalAccessor is HubInfoAccessor)
            {
                var hubPrincipalAccessor = principalAccessor as HubInfoAccessor;
                hubPrincipalAccessor.Principal = HttpContext?.User;
                hubPrincipalAccessor.Context   = new DotNetifyHubContext(httpCallerContext, callType, vmId, data, null, hubPrincipalAccessor.Principal);
            }

            return(new DotNetifyHubHandler(vmControllerFactory, hubServiceProvider, principalAccessor, hubPipeline, hubResponseManager)
            {
                CallerContext = httpCallerContext,
                OnVMResponse = ResponseVMCallback
            });
        }
示例#3
0
 public async Task Dispose_VM(
     string vmId,
     [FromServices] WebApiVMControllerFactory vmControllerFactory,
     [FromServices] IHubServiceProvider hubServiceProvider,
     [FromServices] IPrincipalAccessor principalAccessor,
     [FromServices] IHubPipeline hubPipeline,
     [FromServices] IDotNetifyHubResponseManager hubResponseManager
     )
 {
     var hub = CreateHubHandler(vmControllerFactory, hubServiceProvider, principalAccessor, hubPipeline, hubResponseManager, nameof(IDotNetifyHubMethod.Dispose_VM), vmId);
     await hub.DisposeVMAsync(vmId);
 }
示例#4
0
 /// <summary>
 /// Constructor for dependency injection.
 /// </summary>
 /// <param name="vmControllerFactory">Factory of view model controllers.</param>
 /// <param name="serviceProvider">Allows to provide scoped service provider for the view models.</param>
 /// <param name="principalAccessor">Allows to pass the hub principal.</param>
 /// <param name="hubPipeline">Manages middlewares and view model filters.</param>
 /// <param name="globalHubContext">Provides access to hubs.</param>
 public DotNetifyHub(
     IVMControllerFactory vmControllerFactory,
     IHubServiceProvider serviceProvider,
     IPrincipalAccessor principalAccessor,
     IHubPipeline hubPipeline,
     IHubContext <DotNetifyHub> globalHubContext)
 {
     _vmControllerFactory = vmControllerFactory;
     _vmControllerFactory.ResponseDelegate = Response_VM;
     _serviceProvider   = serviceProvider;
     _principalAccessor = principalAccessor;
     _hubPipeline       = hubPipeline;
     _globalHubContext  = globalHubContext;
 }
示例#5
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);
        }
示例#6
0
        /// <summary>
        /// Initializes the scoped context of the request.
        /// </summary>
        /// <param name="vmController">View model controller.</param>
        /// <param name="hubServiceProvider">Service provideer context.</param>
        /// <param name="principalAccessor">Principal user context.</param>
        /// <returns>HTTP caller context.</returns>
        private HttpCallerContext InitializeContext(VMController vmController, IHubServiceProvider hubServiceProvider, IPrincipalAccessor principalAccessor)
        {
            if (hubServiceProvider is HubServiceProvider)
            {
                (hubServiceProvider as HubServiceProvider).ServiceProvider = vmController.ServiceProvider;
            }

            var httpCallerContext = new HttpCallerContext(HttpContext);

            if (principalAccessor is HubPrincipalAccessor)
            {
                var hubPrincipalAccessor = principalAccessor as HubPrincipalAccessor;
                hubPrincipalAccessor.Principal     = HttpContext?.User;
                hubPrincipalAccessor.CallerContext = httpCallerContext;
            }
            return(httpCallerContext);
        }
示例#7
0
        public async Task <string> Update_VM(
            string vmId,
            [FromQuery] string vmArg,
            [FromBody] Dictionary <string, object> vmData,
            [FromServices] IVMFactory vmFactory,
            [FromServices] IHubServiceProvider hubServiceProvider,
            [FromServices] IVMServiceScopeFactory serviceScopeFactory,
            [FromServices] IHubPipeline hubPipeline,
            [FromServices] IPrincipalAccessor principalAccessor)
        {
            var taskCompletionSource1 = new TaskCompletionSource <string>();
            var taskCompletionSource2 = new TaskCompletionSource <string>();

            var vmController = new VMController((arg1, arg2, arg3) =>
            {
                if (!taskCompletionSource1.TrySetResult(arg3))
                {
                    taskCompletionSource2.TrySetResult(arg3);
                }
            }, vmFactory, serviceScopeFactory.CreateScope())
            {
                ResponseVMFilter = CreateRespondingVMFilter(hubPipeline, vmId, vmData)
            };

            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);

                hubPipeline.RunMiddlewares(hubContext, ctx =>
                {
                    vmController.OnRequestVM(connectionId, ctx.VMId, ctx.Data);
                    return(Task.CompletedTask);
                });
            }
            catch (Exception ex)
            {
                var finalEx = hubPipeline.RunExceptionMiddleware(httpCallerContext, ex);
                if (finalEx is OperationCanceledException == false)
                {
                    taskCompletionSource1.TrySetResult(DotNetifyHub.SerializeException(finalEx));
                }
            }

            await taskCompletionSource1.Task;

            try
            {
                var hubContext = new DotNetifyHubContext(httpCallerContext, nameof(Update_VM), vmId, vmData, BuildHeaders(), httpCallerContext.User);
                vmController.UpdateVMFilter = CreateVMFilter(hubContext, hubPipeline);

                hubPipeline.RunMiddlewares(hubContext, ctx =>
                {
                    vmController.OnUpdateVM(connectionId, ctx.VMId, ctx.Data as Dictionary <string, object>);
                    vmController.Dispose();
                    return(Task.CompletedTask);
                });
            }
            catch (Exception ex)
            {
                var finalEx = hubPipeline.RunExceptionMiddleware(httpCallerContext, ex);
                if (finalEx is OperationCanceledException == false)
                {
                    taskCompletionSource2.TrySetResult(DotNetifyHub.SerializeException(finalEx));
                }
            }

            return(await taskCompletionSource2.Task);
        }