Exemplo n.º 1
0
        object Request(OperationDescription od, object [] parameters)
        {
            if (OperationChannel.State != CommunicationState.Opened)
            {
                OperationChannel.Open();
            }

            ClientOperation op = runtime.Operations [od.Name];

            object [] inspections = new object [runtime.MessageInspectors.Count];
            Message   req         = CreateRequest(op, parameters);

            for (int i = 0; i < inspections.Length; i++)
            {
                inspections [i] = runtime.MessageInspectors [i].BeforeSendRequest(ref req, this);
            }

            Message res = Request(req, OperationTimeout);

            if (res.IsFault)
            {
                MessageFault fault = MessageFault.CreateFault(res, runtime.MaxFaultSize);
                if (fault.HasDetail && fault is MessageFault.SimpleMessageFault)
                {
                    MessageFault.SimpleMessageFault simpleFault = fault as MessageFault.SimpleMessageFault;
                    object         detail            = simpleFault.Detail;
                    Type           t                 = detail.GetType();
                    Type           faultType         = typeof(FaultException <>).MakeGenericType(t);
                    object []      constructorParams = new object [] { detail, fault.Reason, fault.Code, fault.Actor };
                    FaultException fe                = (FaultException)Activator.CreateInstance(faultType, constructorParams);
                    throw fe;
                }
                else
                {
                    // given a MessageFault, it is hard to figure out the type of the embedded detail
                    throw new FaultException(fault);
                }
            }

            for (int i = 0; i < inspections.Length; i++)
            {
                runtime.MessageInspectors [i].AfterReceiveReply(ref res, inspections [i]);
            }

            if (op.DeserializeReply)
            {
                return(op.GetFormatter().DeserializeReply(res, parameters));
            }
            else
            {
                return(res);
            }
        }
Exemplo n.º 2
0
        Message CreateRequest(ClientOperation op, object [] parameters)
        {
            MessageVersion version = message_version;

            if (version == null)
            {
                version = MessageVersion.Default;
            }

            Message msg;

            if (op.SerializeRequest)
            {
                msg = op.GetFormatter().SerializeRequest(
                    version, parameters);
            }
            else
            {
                msg = (Message)parameters [0];
            }

            context = context ?? OperationContext.Current;
            if (context != null)
            {
                // CopyHeadersFrom does not work here (brings duplicates -> error)
                foreach (var mh in context.OutgoingMessageHeaders)
                {
                    int x = msg.Headers.FindHeader(mh.Name, mh.Namespace, mh.Actor);
                    if (x >= 0)
                    {
                        msg.Headers.RemoveAt(x);
                    }
                    msg.Headers.Add((MessageHeader)mh);
                }
                msg.Properties.CopyProperties(context.OutgoingMessageProperties);
            }

            if (OutputSession != null)
            {
                msg.Headers.MessageId = new UniqueId(OutputSession.Id);
            }
            msg.Properties.AllowOutputBatching = AllowOutputBatching;

            return(msg);
        }
Exemplo n.º 3
0
        Message CreateRequest(ClientOperation op, object [] parameters)
        {
            MessageVersion version = message_version;

            if (version == null)
            {
                version = MessageVersion.Default;
            }

            Message msg;

            if (op.SerializeRequest)
            {
                msg = op.GetFormatter().SerializeRequest(
                    version, parameters);
            }
            else
            {
                if (parameters.Length != 1)
                {
                    throw new ArgumentException(String.Format("Argument parameters does not match the expected input. It should contain only a Message, but has {0} parameters", parameters.Length));
                }
                if (!(parameters [0] is Message))
                {
                    throw new ArgumentException(String.Format("Argument should be only a Message, but has {0}", parameters [0] != null ? parameters [0].GetType().FullName : "null"));
                }
                msg = (Message)parameters [0];
            }

            context = context ?? OperationContext.Current;
            if (context != null)
            {
                // CopyHeadersFrom does not work here (brings duplicates -> error)
                foreach (var mh in context.OutgoingMessageHeaders)
                {
                    int x = msg.Headers.FindHeader(mh.Name, mh.Namespace, mh.Actor);
                    if (x >= 0)
                    {
                        msg.Headers.RemoveAt(x);
                    }
                    msg.Headers.Add((MessageHeader)mh);
                }
                msg.Properties.CopyProperties(context.OutgoingMessageProperties);
            }

            if (OutputSession != null)
            {
                msg.Headers.MessageId = new UniqueId(OutputSession.Id);
            }
            msg.Properties.AllowOutputBatching = AllowOutputBatching;

            if (msg.Version.Addressing.Equals(AddressingVersion.WSAddressing10))
            {
                if (msg.Headers.MessageId == null)
                {
                    msg.Headers.MessageId = new UniqueId();
                }
                if (msg.Headers.ReplyTo == null)
                {
                    msg.Headers.ReplyTo = new EndpointAddress(Constants.WsaAnonymousUri);
                }
                if (msg.Headers.To == null)
                {
                    msg.Headers.To = RemoteAddress.Uri;
                }
            }

            return(msg);
        }