Пример #1
0
 protected override AsyncServerStreamingCall <TResponse> CreateRequest(
     DnsToolsWorker.DnsToolsWorkerClient client,
     TRequest request,
     CancellationToken cancellationToken
     )
 {
     return(_createRequest(client));
 }
Пример #2
0
 protected override AsyncServerStreamingCall <TracerouteResponse> CreateRequest(
     DnsToolsWorker.DnsToolsWorkerClient client,
     TracerouteRequest request,
     CancellationToken cancellationToken
     )
 {
     return(client.Traceroute(new TracerouteRequest
     {
         Host = request.Host,
         Protocol = request.Protocol
     }, cancellationToken: cancellationToken));
 }
Пример #3
0
        private async Task RunWorkerAsync(
            string workerId,
            TRequest request,
            DnsToolsWorker.DnsToolsWorkerClient client,
            ChannelWriter <WorkerResponse <TResponse> > writer,
            IToolsHub hub,
            CancellationToken cancellationToken
            )
        {
            try
            {
                if (_workerProvider.GetStatus(workerId) != WorkerStatus.Available)
                {
                    throw new WorkerUnavailableException();
                }
                var call           = CreateRequest(client, request, cancellationToken);
                var responseStream = call.ResponseStream.ReadAllAsync(cancellationToken);
                var responseTasks  = new List <Task>();
                await foreach (var response in responseStream.WithCancellation(cancellationToken))
                {
                    responseTasks.Add(ProcessResponseAsync(workerId, writer, response, hub, cancellationToken));
                }
                responseTasks.Add(WorkerCompletedAsync(workerId, writer, cancellationToken));

                await Task.WhenAll(responseTasks);
            }
            catch (Exception ex)
            {
                var message = ex.Message;
                if (ex is RpcException rpcEx && rpcEx.StatusCode == StatusCode.Cancelled)
                {
                    message = "Could not connect to this worker :(";
                }

                await writer.WriteAsync(new WorkerResponse <TResponse>
                {
                    Response = new TResponse
                    {
                        Error = new Error
                        {
                            Message = message,
                        },
                    },
                    WorkerId = workerId,
                }, cancellationToken).ConfigureAwait(false);
            }
        }
Пример #4
0
 protected abstract AsyncServerStreamingCall <TResponse> CreateRequest(
     DnsToolsWorker.DnsToolsWorkerClient client,
     TRequest request,
     CancellationToken cancellationToken
     );