public static void MessageContract_RoundTrips_Properties_And_Headers() { MockChannelFactory <IRequestChannel> mockChannelFactory = null; MockRequestChannel mockRequestChannel = null; RequestBankingData_4_4_0 request = null; RequestBankingData_4_4_0 reply = null; // *** SETUP *** \\ // Intercept the creation of the factory so we can intercept creation of the channel Func <Type, BindingContext, IChannelFactory> buildFactoryAction = (Type type, BindingContext context) => { mockChannelFactory = new MockChannelFactory <IRequestChannel>(context, new TextMessageEncodingBindingElement().CreateMessageEncoderFactory()); mockChannelFactory.OnCreateChannelOverride = (EndpointAddress endpoint, Uri via) => { // When the channel is created, override the Request method to capture properties and headers mockRequestChannel = (MockRequestChannel)mockChannelFactory.DefaultOnCreateChannel(endpoint, via); mockRequestChannel.RequestOverride = (msg, timeout) => { // Echo back a fresh copy of the request MessageBuffer buffer = msg.CreateBufferedCopy(Int32.MaxValue); Message replyMsg = buffer.CreateMessage(); return(replyMsg); }; return(mockRequestChannel); }; return(mockChannelFactory); }; MockTransportBindingElement mockBindingElement = new MockTransportBindingElement(); mockBindingElement.BuildChannelFactoryOverride = buildFactoryAction; CustomBinding binding = new CustomBinding(mockBindingElement); EndpointAddress address = new EndpointAddress("myprotocol://localhost:5000"); var factory = new ChannelFactory <IMessageContractRoundTrip_4_4_0>(binding, address); IMessageContractRoundTrip_4_4_0 channel = factory.CreateChannel(); // Prepare a strongly-typed request request = new RequestBankingData_4_4_0(); request.accountName = "My account"; request.transactionDate = DateTime.Now; request.requestTestProperty = "test property"; request.testValue = "test value"; request.testValues = new string[] { "test", "values" }; request.testValuesArray = new string[] { "test", "values", "array" }; // *** EXECUTE *** \\ reply = channel.MessageContractRoundTrip(request); // *** VALIDATE *** \\ Assert.True(String.Equals(request.requestTestProperty, reply.requestTestProperty), String.Format("TestProperty expected = '{0}' actual = '{1}'", request.requestTestProperty, reply.requestTestProperty)); ValidateArray("TestValues", request.testValues, reply.testValues); ValidateArray("TestValuesArray", request.testValuesArray, reply.testValuesArray); }
public static void MessageContract_Builds_Correct_Request_Message_Properties_And_Headers() { MockChannelFactory <IRequestChannel> mockChannelFactory = null; MockRequestChannel mockRequestChannel = null; RequestBankingData_4_4_0 request = null; Dictionary <string, string> properties = new Dictionary <string, string>(); Dictionary <string, List <string> > headers = new Dictionary <string, List <string> >(); // *** SETUP *** \\ // Intercept the creation of the factory so we can intercept creation of the channel Func <Type, BindingContext, IChannelFactory> buildFactoryAction = (Type type, BindingContext context) => { mockChannelFactory = new MockChannelFactory <IRequestChannel>(context, new TextMessageEncodingBindingElement().CreateMessageEncoderFactory()); mockChannelFactory.OnCreateChannelOverride = (EndpointAddress endpoint, Uri via) => { // When the channel is created, override the Request method to capture properties and headers mockRequestChannel = (MockRequestChannel)mockChannelFactory.DefaultOnCreateChannel(endpoint, via); mockRequestChannel.RequestOverride = (msg, timeout) => { // Capture properties and headers before the message is read and closed foreach (var property in msg.Properties) { properties[property.Key] = property.Value.ToString(); } foreach (MessageHeader header in msg.Headers) { List <string> values = null; if (!headers.TryGetValue(header.Name, out values)) { values = new List <string>(); headers[header.Name] = values; } string headerValue = header.ToString().Replace(Environment.NewLine, String.Empty).Replace(" ", String.Empty); values.Add(headerValue); } // Echo back a fresh copy of the request MessageBuffer buffer = msg.CreateBufferedCopy(Int32.MaxValue); return(buffer.CreateMessage()); }; return(mockRequestChannel); }; return(mockChannelFactory); }; MockTransportBindingElement mockBindingElement = new MockTransportBindingElement(); mockBindingElement.BuildChannelFactoryOverride = buildFactoryAction; CustomBinding binding = new CustomBinding(mockBindingElement); EndpointAddress address = new EndpointAddress("myprotocol://*****:*****@"<?xml version=""1.0"" encoding=""utf-16""?>" + @"<h:Request_SingleRequestValue xmlns:h=""http://www.contoso.com"">test value</h:Request_SingleRequestValue>"); ValidateHeader(headers, TestTypeConstants_4_4_0.MessageContract_Request_MultipleValueName, @"<?xml version=""1.0"" encoding=""utf-16""?>" + @"<h:Request_MultipleRequestValue xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:h=""http://www.contoso.com"">" + @"<string xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">test</string>" + @"<string xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays"">values</string>" + @"</h:Request_MultipleRequestValue>"); ValidateHeader(headers, TestTypeConstants_4_4_0.MessageContract_Request_MultipleArrayValueName, @"<?xml version=""1.0"" encoding=""utf-16""?>" + @"<h:Request_MultipleArrayRequestValue xmlns:h=""http://www.contoso.com"">test</h:Request_MultipleArrayRequestValue>", @"<?xml version=""1.0"" encoding=""utf-16""?>" + @"<h:Request_MultipleArrayRequestValue xmlns:h=""http://www.contoso.com"">values</h:Request_MultipleArrayRequestValue>", @"<?xml version=""1.0"" encoding=""utf-16""?>" + @"<h:Request_MultipleArrayRequestValue xmlns:h=""http://www.contoso.com"">array</h:Request_MultipleArrayRequestValue>"); }