Ejemplo n.º 1
0
        public void SendOneWay(IServiceRemotingRequestMessage requestMessage)
        {
            IMessageBody   outgoingMessageBody   = null;
            IMessageHeader outgoingMessageHeader = null;

            try
            {
                var headerSerialzier = this.serializersManager.GetHeaderSerializer();
                outgoingMessageHeader = headerSerialzier.SerializeRequestHeader(requestMessage.GetHeader());
                var requestSerializer =
                    this.serializersManager.GetRequestBodySerializer(requestMessage.GetHeader().InterfaceId);
                outgoingMessageBody = requestSerializer.Serialize(requestMessage.GetBody());
                this.callbackChannel.SendOneWay(outgoingMessageHeader.GetSendBuffer(),
                                                outgoingMessageBody.GetSendBuffers());
            }
            finally
            {
                if (outgoingMessageHeader != null)
                {
                    outgoingMessageHeader.Dispose();
                }
                if (outgoingMessageBody != null)
                {
                    outgoingMessageBody.Dispose();
                }
            }
        }
Ejemplo n.º 2
0
            public async Task <ResponseMessage> RequestResponseAsync(ArraySegment <byte> messageHeaders,
                                                                     IEnumerable <ArraySegment <byte> > requestBody)
            {
                IMessageBody   outgoingMessageBody   = null;
                IMessageHeader outgoingMessageHeader = null;

                try
                {
                    var headerSerializer   = this.serializersManager.GetHeaderSerializer();
                    var deSerializedHeader =
                        headerSerializer.DeserializeRequestHeaders(
                            new IncomingMessageHeader(new SegmentedReadMemoryStream(messageHeaders)));

                    var msgBodySerializer =
                        this.serializersManager.GetRequestBodySerializer(deSerializedHeader.InterfaceId);
                    var deserializedMsg =
                        msgBodySerializer.Deserialize(
                            new IncomingMessageBody(new SegmentedReadMemoryStream(requestBody)));

                    var msg    = new ServiceRemotingRequestMessage(deSerializedHeader, deserializedMsg);
                    var retval = await
                                 this.messageHandler.HandleRequestResponseAsync(
                        this.requestContext,
                        msg);

                    if (retval == null)
                    {
                        return(new ResponseMessage());
                    }

                    outgoingMessageHeader = headerSerializer.SerializeResponseHeader(retval.GetHeader());

                    var responseSerializer =
                        this.serializersManager.GetResponseBodySerializer(deSerializedHeader.InterfaceId);

                    outgoingMessageBody = responseSerializer.Serialize(retval.GetBody());

                    var responseMessage = new ResponseMessage();
                    responseMessage.ResponseBody = outgoingMessageBody != null
                        ? outgoingMessageBody.GetSendBuffers()
                        : new List <ArraySegment <byte> >();

                    responseMessage.MessageHeaders = outgoingMessageHeader != null
                        ? outgoingMessageHeader.GetSendBuffer()
                        : new ArraySegment <byte>();

                    return(responseMessage);
                }
                catch (Exception e)
                {
                    ServiceTrace.Source.WriteInfo("WcfRemotingService", "Remote Exception occured {0}", e);
                    throw new FaultException <RemoteException>(RemoteException.FromException(e), e.Message);
                }
            }
Ejemplo n.º 3
0
        public async Task <IServiceRemotingResponseMessage> RequestResponseAsync(IServiceRemotingRequestMessage requestMessage)
        {
            IMessageBody   serializedMsgBody = null;
            IMessageHeader serializedHeader  = null;

            try
            {
                //Find the Serializer
                var interfaceId = requestMessage.GetHeader().InterfaceId;
                serializedHeader = this.serializersManager.GetHeaderSerializer()
                                   .SerializeRequestHeader(requestMessage.GetHeader());
                var msgBodySeriaizer = this.serializersManager.GetRequestBodySerializer(interfaceId);
                serializedMsgBody = msgBodySeriaizer.Serialize(requestMessage.GetBody());

                var responseMessage = await this.WcfClient.Channel.RequestResponseAsync(
                    serializedHeader.GetSendBuffer(),
                    serializedMsgBody == null?new List <ArraySegment <byte> >() : serializedMsgBody.GetSendBuffers())
                                      .ContinueWith(
                    t => t.GetAwaiter().GetResult(),
                    TaskScheduler.Default);

                // the code above (TaskScheduler.Default) for dispatches the responses on different thread
                // so that if the user code blocks, we do not stop the response receive pump in WCF
                var incomingHeader = (responseMessage != null && responseMessage.MessageHeaders != null)
                    ? new IncomingMessageHeader(
                    new SegmentedReadMemoryStream(responseMessage.MessageHeaders))
                    : null;

                ////DeSerialize Response Header
                var header =
                    this.serializersManager.GetHeaderSerializer()
                    .DeserializeResponseHeaders(
                        incomingHeader);

                ////DeSerialize Response Body

                var responseSerializer = this.serializersManager.GetResponseBodySerializer(interfaceId);

                var incomingMsgBody = (responseMessage != null && responseMessage.ResponseBody != null)
                    ? new IncomingMessageBody(new SegmentedReadMemoryStream(responseMessage.ResponseBody))
                    : null;

                var msgBody =
                    responseSerializer.Deserialize(incomingMsgBody);
                //Create Response Message
                return((IServiceRemotingResponseMessage) new ServiceRemotingResponseMessage(header,
                                                                                            msgBody));
            }
            catch (FaultException <RemoteException> faultException)
            {
                Exception remoteException;
                if (RemoteException.ToException(new SegmentedReadMemoryStream(faultException.Detail.Data),
                                                out remoteException))
                {
                    throw new AggregateException(remoteException);
                }

                throw new ServiceException(remoteException.GetType().FullName, string.Format(
                                               CultureInfo.InvariantCulture,
                                               Microsoft.ServiceFabric.Services.Wcf.SR.ErrorDeserializationFailure,
                                               remoteException.ToString()));
            }
        }