/// <summary> /// Override. /// </summary> protected void SendResponding(TransportInfo inputMessageTransportInfo, TransportMessage message) { List <ArbiterClientId?> forwardingInfo = inputMessageTransportInfo.CreateRespondingClientList(); DoSendAndReceiveForwarding(forwardingInfo, message, DefaultTimeOut, null); }
/// <summary> /// Will unsubscribe to previous one. /// </summary> protected bool SetRemoteStatusSynchronizationSource(TransportInfo sourceTransportInfo) { lock (this) { if (_remoteStatusSynchronizationSource != null) { SubscribeToOperationalStateChangesMessage message = new SubscribeToOperationalStateChangesMessage(false); message.RequestResponse = false; SendResponding(_remoteStatusSynchronizationSource, message); } _remoteStatusSynchronizationSource = sourceTransportInfo; } bool result = true; if (sourceTransportInfo != null) { ResponseMessage response = SendAndReceiveResponding <ResponseMessage>(sourceTransportInfo, new SubscribeToOperationalStateChangesMessage(true)); result = response != null && response.OperationResult; } TracerHelper.TraceEntry(this.GetType().Name + ", Remote synchronization source " + sourceTransportInfo.OriginalSenderId.Value.Id.Name + " assinged - " + result.ToString()); return(result); }
/// <summary> /// Handle a request message. /// </summary> protected virtual void HandleRequestMessage(TransportMessage message) { FastInvokeHelper.FastInvokeHandlerDelegate handler = GetMessageHandler(message); if (handler == null) {// We failed to find a handler for this type or for any of the parent ones. TracerHelper.TraceError("Client instance did not handle a request message received, client [" + this.GetType().Name + "], message [" + message.GetType().Name + "]."); return; } // Before giving the requestMessage to the user class, make a copy of its transport info // so that if the user messes it up, we still can deliver the responce properly. TransportInfo requestMessageTransportInfo = message.TransportInfo.Clone(); TransportMessage responseMessage = (TransportMessage)handler(this, new object[] { message }); if (responseMessage == null) {// No result. return; } if (responseMessage is ResponseMessage) { ((ResponseMessage)responseMessage).RequestMessageTypeName = message.GetType().Name; } Guid sessionGuid = requestMessageTransportInfo.CurrentTransportInfo.Value.Id; ArbiterClientId?senderID = requestMessageTransportInfo.CurrentTransportInfo.Value.SenderID; requestMessageTransportInfo.PopTransportInfo(); // Transfer inherited underlaying transport stack. responseMessage.TransportInfo = requestMessageTransportInfo; // Send the responce requestMessage back. DoSendCustom(false, sessionGuid, null, 0, senderID, this.SubscriptionClientID, responseMessage, TimeSpan.Zero); }
/// <summary> /// The "Responding" set of functions allows to easily send a new request to a location /// that has sent you a requestMessage, even if this location is remote (trough server-client nodes). /// </summary> protected TExpectedMessageClass SendAndReceiveResponding <TExpectedMessageClass>(TransportInfo inputMessageTransportInfo, TransportMessage message, TimeSpan timeOut) where TExpectedMessageClass : TransportMessage { List <ArbiterClientId?> forwardingInfo = inputMessageTransportInfo.CreateRespondingClientList(); return((TExpectedMessageClass)DoSendAndReceiveForwarding(forwardingInfo, message, timeOut, typeof(TExpectedMessageClass))); }
/// <summary> /// Override. /// </summary> protected TExpectedMessageClass SendAndReceiveResponding <TExpectedMessageClass>( TransportInfo incomingMessageTransportInfo, TransportMessage message) where TExpectedMessageClass : TransportMessage { return(SendAndReceiveResponding <TExpectedMessageClass>(incomingMessageTransportInfo, message, DefaultTimeOut)); }
public new void SendResponding(TransportInfo incomingMessageTransportInfo, TransportMessage message) { base.SendResponding(incomingMessageTransportInfo, message); }
/// <summary> /// /// </summary> /// <param name="singleThreadMode"></param> public OperationalTransportClient(SerializationInfo info, StreamingContext context) : base(info, context) { _statusSynchronizationEnabled = info.GetBoolean("statusSynchronizationEnabled"); _persistedRemoteStatusSynchronizationSource = (TransportInfo)info.GetValue("remoteStatusSynchronizationSource", typeof(TransportInfo)); }