/// <summary>
 /// Adds a Service-Tag to an existing service
 /// </summary>
 /// <param name="serviceSession">the service-session for which to add a tag</param>
 /// <param name="tagName">the tag-key of the given value</param>
 /// <param name="value">the tag-value</param>
 public void AddServiceTag(ServiceSessionOperationMessage serviceSession, string tagName, string value)
 {
     if (GrabService(serviceSession.ServiceName, serviceSession.SessionTicket, true, out var service, out var operations, out var waitingMessages))
     {
         service.SetTag(tagName, value);
     }
 }
Exemple #2
0
        public override async Task ServiceReady(ServiceSessionOperationMessage request, IMemoryChannel channel, DataTransferContext context)
        {
            try
            {
                if (string.IsNullOrEmpty(request.ResponderFor))
                {
                    CheckAuth(context, "ActAsService");
                }
                else
                {
                    CheckAuth(context, "ConnectAnyService", request.ResponderFor);
                }

                await base.ServiceReady(request, channel, context);
            }
            catch (Exception ex)
            {
                LogEnvironment.LogEvent(ex.OutlineException(), LogSeverity.Error);
                throw;
            }
            finally
            {
                TemporaryGrants.UnRegisterService(request.ServiceName);
                if (!string.IsNullOrEmpty(request.ResponderFor))
                {
                    TemporaryGrants.RevokeTemporaryPermission(request.ResponderFor, request.ServiceName);
                }
            }
        }
        public virtual Task <ServiceTickResponseMessage> ServiceTick(ServiceSessionOperationMessage request, DataTransferContext context)
        {
            var retRaw = serviceBackend.Broker.Tick(request);

            return(Task.FromResult(new ServiceTickResponseMessage
            {
                Ok = retRaw.Ok,
                PendingOperationsCount = retRaw.PendingOperationsCount,
                Reason = retRaw.Reason
            }));
        }
 public void ServiceTick(ServiceSessionOperationMessage session)
 {
     try
     {
         channel.Request(session).GetAwaiter().GetResult();
     }
     catch (Exception ex)
     {
         LogEnvironment.LogDebugEvent($"Error sending Tick: {ex.Message}", LogSeverity.Error);
     }
 }
        public override Task <ServiceTickResponseMessage> ServiceTick(ServiceSessionOperationMessage request, ServerCallContext context)
        {
            var retRaw = serviceBackend.Broker.Tick(new MessagingShared.Hub.Protocol.ServiceSessionOperationMessage
            {
                ResponderFor  = request.ResponderFor,
                ServiceName   = request.ServiceName,
                SessionTicket = request.SessionTicket,
                Ttl           = request.Ttl,
                Tick          = true
            });

            return(Task.FromResult(new ServiceTickResponseMessage
            {
                Ok = retRaw.Ok,
                PendingOperationsCount = retRaw.PendingOperationsCount,
                Reason = retRaw.Reason ?? ""
            }));
        }
Exemple #6
0
        public override Task <ServiceTickResponseMessage> ServiceTick(ServiceSessionOperationMessage request, DataTransferContext context)
        {
            try
            {
                if (string.IsNullOrEmpty(request.ResponderFor))
                {
                    CheckAuth(context, "ActAsService");
                }
                else
                {
                    CheckAuth(context, "ConnectAnyService", request.ResponderFor);
                }

                return(base.ServiceTick(request, context));
            }
            catch (Exception ex)
            {
                return(Task.FromException <ServiceTickResponseMessage>(ex));
            }
        }
 public void FailOperation(ServiceSessionOperationMessage serviceSession, string req, Exception ex)
 {
     if (req != null)
     {
         try
         {
             if (GrabService(serviceSession.ServiceName, serviceSession.SessionTicket, true, out var service, out var operations, out var waitingMessages))
             {
                 if (waitingMessages.TryGetValue(req, out var rq))
                 {
                     rq.ServerResponse.SetException(ex);
                 }
             }
         }
         catch (Exception x)
         {
             LogEnvironment.LogEvent($"Failed to set ServerResponse: {x.Message}", LogSeverity.Error);
         }
     }
 }
        public Task <ServerOperationMessage> NextRequest(ServiceSessionOperationMessage serviceSession)
        {
            if (GrabService(serviceSession.ServiceName, serviceSession.SessionTicket, true, out var service, out var operations, out var waitingMessages))
            {
                if (service.ServiceKind == ServiceStatus.ServiceType.Local)
                {
                    throw new CommunicationException("Not used for local clients!");
                }

                Task <OperationWaitHandle> retTask = null;
                lock (service)
                {
                    if (operations.IsEmpty && service.OpenTaskWait == null)
                    {
                        retTask = (service.OpenTaskWait = new TaskCompletionSource <OperationWaitHandle>(TaskCreationOptions.RunContinuationsAsynchronously)).Task;
                    }
                    else if (!operations.IsEmpty && operations.TryDequeue(out var retVal))
                    {
                        retTask = Task.FromResult(retVal);
                    }
                }

                if (retTask != null)
                {
                    return(retTask.ContinueWith((t, s) =>
                    {
                        if (t.Result != null && !t.Result.ClientRequest.TickBack)
                        {
                            waitingMessages.TryAdd(t.Result.ClientRequest.OperationId, t.Result);
                        }

                        return t.Result?.ClientRequest;
                    }, null, TaskContinuationOptions.None));
                }

                //return retTask;
            }

            throw new CommunicationException("Unknown Service-grab - Error");
        }
        public override async Task ServiceReady(ServiceSessionOperationMessage request, IServerStreamWriter <ServerOperationMessage> responseStream, ServerCallContext context)
        {
            CancellationToken cancellationToken = context.CancellationToken;
            var req = new MessagingShared.Hub.Protocol.ServiceSessionOperationMessage
            {
                ResponderFor  = request.ResponderFor ?? "",
                SessionTicket = request.SessionTicket ?? "",
                Ttl           = request.Ttl,
                ServiceName   = request.ServiceName ?? "",
                Tick          = false
            };

            try
            {
                do
                {
                    try
                    {
                        var nextMessage = await serviceBackend.Broker.NextRequest(req);

                        if (nextMessage != null)
                        {
                            await responseStream.WriteAsync(new ServerOperationMessage
                            {
                                HubUser          = nextMessage.HubUser ?? "",
                                OperationId      = nextMessage.OperationId ?? "",
                                OperationPayload = nextMessage.OperationPayload ?? "",
                                TargetService    = nextMessage.TargetService ?? "",
                                TickBack         = nextMessage.TickBack
                            }).ConfigureAwait(false);
                        }
                        else
                        {
                            await Task.Delay(500, cancellationToken).ConfigureAwait(false);
                        }
                    }
                    catch (ServiceBrokenException sbe)
                    {
                        LogEnvironment.LogEvent($"Error occurred: {sbe.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (ServiceTimeoutException ste)
                    {
                        LogEnvironment.LogEvent($"Error occurred: {ste.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (ServiceUnknownException sue)
                    {
                        LogEnvironment.LogEvent($"Error occurred: {sue.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (Exception ex)
                    {
                        LogEnvironment.LogEvent($"Error occurred: {ex.OutlineException()}", LogSeverity.Error);
                    }
                } while (cancellationToken.IsCancellationRequested == false);
            }
            finally
            {
                serviceBackend.Broker.TryUnRegisterService(req);
            }
        }
        /// <summary>
        /// Initializes the hubconnection with the remote hub
        /// </summary>
        private void InitHubConnection()
        {
            rnd            = new Random();
            client         = factory.CreateClient(serviceAddr, channel);
            client.Broken += ClientBroken;
            ServiceName    = myServiceName;
            if (!string.IsNullOrEmpty(ServiceName))
            {
                mySvc = new RegisterServiceMessage {
                    ServiceName = ServiceName, Ttl = 15
                };
                if (!string.IsNullOrEmpty(consumedService))
                {
                    mySvc.ResponderFor = consumedService;
                }

                var reg = client.RegisterService(mySvc);
                if (reg.Ok)
                {
                    session = new ServiceSessionOperationMessage {
                        ServiceName = mySvc.ServiceName, SessionTicket = reg.SessionTicket, Ttl = mySvc.Ttl
                    };
                    if (!string.IsNullOrEmpty(consumedService))
                    {
                        session.ResponderFor = consumedService;
                    }

                    tickTimer.Change(0, TickPeriod);
                    serverCallbackCancel = new CancellationTokenSource();
                    var token = serverCallbackCancel.Token;
                    Task.Run(async() =>
                    {
                        var cancelR = token;
                        try
                        {
                            client.ServiceReady(session);
                            LogEnvironment.LogDebugEvent("Service is ready!", LogSeverity.Report);
                            while (await channel.MoveNext().ConfigureAwait(false))
                            {
                                var c = channel.Current;
                                LogEnvironment.LogDebugEvent(
                                    $"TargetService: {c.TargetService}, TickBack: {c.TickBack}, Id: {c.OperationId}",
                                    LogSeverity.Report);
                                if (!c.TickBack)
                                {
                                    var msg = new MessageArrivedEventArgs
                                    {
                                        Message       = c.OperationPayload,
                                        TargetService = c.TargetService
                                    };

                                    if (!string.IsNullOrEmpty(c.HubUser))
                                    {
                                        msg.HubUser = JsonHelper.FromJsonStringStrongTyped <TransferIdentity>(c.HubUser)
                                                      .ToIdentity(customServerSecurity);
                                    }

                                    OnMessageArrived(msg);
                                    ServiceOperationResponseMessage ret;
                                    if (msg.Completed)
                                    {
                                        if (msg.Error == null)
                                        {
                                            ret = new ServiceOperationResponseMessage
                                            {
                                                OperationId     = c.OperationId,
                                                ResponsePayload = msg.Response,
                                                TargetService   = c.TargetService,
                                                Ok = true
                                            };
                                        }
                                        else
                                        {
                                            ret = new ServiceOperationResponseMessage
                                            {
                                                OperationId     = c.OperationId,
                                                ResponsePayload = JsonHelper.ToJsonStrongTyped(msg.Error, true),
                                                TargetService   = c.TargetService,
                                                Ok = false
                                            };
                                        }
                                    }
                                    else
                                    {
                                        ret = new ServiceOperationResponseMessage
                                        {
                                            OperationId     = c.OperationId,
                                            TargetService   = c.TargetService,
                                            ResponsePayload = JsonHelper.ToJsonStrongTyped(
                                                new SerializedException("Message was not processed!",
                                                                        new SerializedException[0]), true),
                                            Ok = false
                                        };
                                    }

                                    if (!string.IsNullOrEmpty(consumedService))
                                    {
                                        ret.ResponderFor = consumedService;
                                    }

                                    client.CommitServiceOperation(ret);
                                }
                                else
                                {
                                    LogEnvironment.LogDebugEvent("TickBack from Hub!", LogSeverity.Report);
                                }
                            }
                        }
                        catch (IOException ex)
                        {
                            LogEnvironment.LogDebugEvent(
                                $"Connection has gone... {ex.Message}, {ex.GetType().FullName}", LogSeverity.Warning);
                        }
                        catch (CommunicationException ex)
                        {
                            LogEnvironment.LogDebugEvent($"Connection has gone... {ex.Message}", LogSeverity.Warning);
                        }
                        catch (Exception ex)
                        {
                            LogEnvironment.LogEvent($"Unexpected Error: {ex.OutlineException()}", LogSeverity.Error);
                        }
                        finally
                        {
                            if (!disposing)
                            {
                                LostConnection();
                            }
                        }
                    }, token);
                }
                else
                {
                    ServiceName = null;
                    throw new Exception($"Unable to register Service: {reg.Reason}");
                }
            }
        }
        public virtual async Task ServiceReady(ServiceSessionOperationMessage request, IMemoryChannel channel, DataTransferContext context)
        {
            CancellationToken cancellationToken = channel.CancellationToken;

            try
            {
                serviceBackend.Broker.AddServiceTag(request, "ChannelName", channel.Name);
                do
                {
                    string req = null;
                    try
                    {
                        var nextMessage = await serviceBackend.Broker.NextRequest(request);

                        req = nextMessage.OperationId;
                        if (nextMessage != null)
                        {
                            await channel.WriteAsync(new ServerOperationMessage
                            {
                                HubUser          = nextMessage.HubUser,
                                OperationId      = nextMessage.OperationId,
                                OperationPayload = nextMessage.OperationPayload,
                                TargetService    = nextMessage.TargetService,
                                TickBack         = nextMessage.TickBack
                            }).ConfigureAwait(false);
                        }
                        else
                        {
                            await Task.Delay(500, cancellationToken).ConfigureAwait(false);
                        }
                    }
                    catch (ServiceBrokenException sbe)
                    {
                        serviceBackend.Broker.FailOperation(request, req, sbe);
                        LogEnvironment.LogEvent($"Error occurred: {sbe.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (ServiceTimeoutException ste)
                    {
                        serviceBackend.Broker.FailOperation(request, req, ste);
                        LogEnvironment.LogEvent($"Error occurred: {ste.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (ServiceUnknownException sue)
                    {
                        serviceBackend.Broker.FailOperation(request, req, sue);
                        LogEnvironment.LogEvent($"Error occurred: {sue.Message}", LogSeverity.Error);
                        break;
                    }
                    catch (Exception ex)
                    {
                        serviceBackend.Broker.FailOperation(request, req, ex);
                        LogEnvironment.LogEvent($"Error occurred: {ex.OutlineException()}", LogSeverity.Error);
                    }
                } while (cancellationToken.IsCancellationRequested == false);
            }
            finally
            {
                serviceBackend.Broker.TryUnRegisterService(request);
            }
        }
 public void ServiceReady(ServiceSessionOperationMessage session)
 {
     channel.Write(session);
 }
Exemple #13
0
        /// <summary>
        /// Initializes the hubconnection with the remote hub
        /// </summary>
        private void InitHubConnection()
        {
            AppContext.SetSwitch(
                "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            rnd = new Random();
            GrpcChannelOptions options = new GrpcChannelOptions();

            configurator.ConfigureChannel(options);
            channel     = GrpcChannel.ForAddress(serviceAddr, options);
            client      = new ServiceHub.ServiceHubClient(channel);
            ServiceName = myServiceName;
            if (!string.IsNullOrEmpty(ServiceName))
            {
                mySvc = new RegisterServiceMessage {
                    ServiceName = ServiceName, Ttl = 15
                };
                if (!string.IsNullOrEmpty(consumedService))
                {
                    mySvc.ResponderFor = consumedService;
                }

                var reg = client.RegisterService(mySvc);
                if (reg.Ok)
                {
                    session = new ServiceSessionOperationMessage {
                        ServiceName = mySvc.ServiceName, SessionTicket = reg.SessionTicket, Ttl = mySvc.Ttl
                    };
                    if (!string.IsNullOrEmpty(consumedService))
                    {
                        session.ResponderFor = consumedService;
                    }

                    tickTimer.Change(0, TickPeriod);
                    serverCallbackCancel = new CancellationTokenSource();
                    var token = serverCallbackCancel.Token;
                    Task.Run(async() =>
                    {
                        var cancelR = token;
                        var en      = client.ServiceReady(session, new CallOptions(cancellationToken: cancelR));
                        try
                        {
                            while (await en.ResponseStream.MoveNext())
                            {
                                var c = en.ResponseStream.Current;
                                if (!c.TickBack)
                                {
                                    var msg = new MessageArrivedEventArgs
                                    {
                                        Message       = c.OperationPayload,
                                        TargetService = c.TargetService
                                    };

                                    if (!string.IsNullOrEmpty(c.HubUser))
                                    {
                                        msg.HubUser = JsonHelper.FromJsonStringStrongTyped <TransferIdentity>(c.HubUser).ToIdentity(customServerSecurity);
                                    }

                                    OnMessageArrived(msg);
                                    ServiceOperationResponseMessage ret;
                                    if (msg.Completed)
                                    {
                                        if (msg.Error == null)
                                        {
                                            ret = new ServiceOperationResponseMessage
                                            {
                                                OperationId     = c.OperationId,
                                                ResponsePayload = msg.Response,
                                                TargetService   = c.TargetService,
                                                Ok = true
                                            };
                                        }
                                        else
                                        {
                                            ret = new ServiceOperationResponseMessage
                                            {
                                                OperationId     = c.OperationId,
                                                ResponsePayload = JsonHelper.ToJsonStrongTyped(msg.Error, true),
                                                TargetService   = c.TargetService,
                                                Ok = false
                                            };
                                        }
                                    }
                                    else
                                    {
                                        ret = new ServiceOperationResponseMessage
                                        {
                                            OperationId     = c.OperationId,
                                            TargetService   = c.TargetService,
                                            ResponsePayload = JsonHelper.ToJsonStrongTyped(new SerializedException("Message was not processed!", new SerializedException[0]), true),
                                            Ok = false
                                        };
                                    }

                                    if (!string.IsNullOrEmpty(consumedService))
                                    {
                                        ret.ResponderFor = consumedService;
                                    }

                                    client.CommitServiceOperation(ret);
                                }
                                else
                                {
                                    LogEnvironment.LogDebugEvent("TickBack from Hub!", LogSeverity.Report);
                                }
                            }
                        }
                        catch (IOException ex)
                        {
                            LogEnvironment.LogDebugEvent($"Connection has gone... {ex.Message}, {ex.GetType().FullName}", LogSeverity.Warning);
                            if (!disposing)
                            {
                                LostConnection();
                            }
                        }
                        catch (RpcException ex)
                        {
                            LogEnvironment.LogDebugEvent($"Connection has gone... {ex.Message}", LogSeverity.Warning);
                            if (!disposing)
                            {
                                LostConnection();
                            }
                        }
                    }, token);
                }
                else
                {
                    ServiceName = null;
                    throw new Exception($"Unable to register Service: {reg.Reason}");
                }
            }
        }