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); } }
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); }
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); }