static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(System.ServiceModel.Routing.RoutingService), new Uri("http://localhost:14552/router"))) { ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.HttpGetUrl = new Uri(host.BaseAddresses[0] + "/mex"); host.Description.Behaviors.Add(smb); var routingConfig = new RoutingConfiguration(); var filter = new MatchAllMessageFilter(); var endpoints = new List <ServiceEndpoint>(); endpoints.Add(getEchoClient(15560)); endpoints.Add(getEchoClient(33344)); endpoints.Add(getEchoClient(22455)); routingConfig.FilterTable.Add(filter, endpoints, 2); RoutingBehavior routingBehavior = new RoutingBehavior(routingConfig); host.Description.Behaviors.Add(routingBehavior); host.AddServiceEndpoint(typeof(IRequestReplyRouter), new BasicHttpBinding(), ""); host.Open(); PrintServiceDescription(host); Console.ReadKey(); } }
protected override object CreateBehavior() { MessageFilter addressFilter = new MatchAllMessageFilter(); MessageFilter contractFilter = new ActionMappingContractFilter(fromAction, toAction); CustomEndpointBehavior behavior = new CustomEndpointBehavior(addressFilter, contractFilter); return(behavior); }
static CorrelationQuery CreateDefaultCorrelationQuery(CorrelationQuery query, string action, CorrelationDataDescription data, ref bool shouldPreserveMessage) { MessageQuery messageQuery = new XPathMessageQuery { Expression = string.Format(CultureInfo.InvariantCulture, defaultQueryFormat, data.Name), Namespaces = new XPathMessageContext() }; if (data.IsOptional) { messageQuery = new OptionalMessageQuery { Query = messageQuery }; } if (query == null) { MessageFilter filter; // verify if the data name is added by the context channel bool isContextQuery = (data.Name == contextCorrelationName); // if there is a query that is not a context query set it to true since we might read from // the message body if (!shouldPreserveMessage && !isContextQuery) { shouldPreserveMessage = true; } // this is a server side query, we use an action filter if (action == MessageHeaders.WildcardAction) { filter = new MatchAllMessageFilter(); } else { filter = new ActionMessageFilter(action); } return(new CorrelationQuery { Where = filter, IsDefaultContextQuery = isContextQuery, Select = new MessageQuerySet { { data.Name, messageQuery } } }); } else { query.Select[data.Name] = messageQuery; return(query); } }
internal MessageFilter CreateFilter(XmlNamespaceManager xmlNamespaces, FilterElementCollection filters) { MessageFilter filter; switch (this.FilterType) { case FilterType.Action: filter = new ActionMessageFilter(this.FilterData); break; case FilterType.EndpointAddress: filter = new EndpointAddressMessageFilter(new EndpointAddress(this.FilterData), false); break; case FilterType.PrefixEndpointAddress: filter = new PrefixEndpointAddressMessageFilter(new EndpointAddress(this.FilterData), false); break; case FilterType.And: MessageFilter filter1 = filters[this.Filter1].CreateFilter(xmlNamespaces, filters); MessageFilter filter2 = filters[this.Filter2].CreateFilter(xmlNamespaces, filters); filter = new StrictAndMessageFilter(filter1, filter2); break; case FilterType.EndpointName: filter = new EndpointNameMessageFilter(this.FilterData); break; case FilterType.MatchAll: filter = new MatchAllMessageFilter(); break; case FilterType.Custom: filter = CreateCustomFilter(this.CustomType, this.FilterData); break; case FilterType.XPath: filter = new XPathMessageFilter(this.FilterData, xmlNamespaces); break; default: // We can't really ever get here because set_FilterType performs validation. throw FxTrace.Exception.AsError(new InvalidOperationException()); } return(filter); }
private static CorrelationQuery CreateDefaultCorrelationQuery(CorrelationQuery query, string action, CorrelationDataDescription data, ref bool shouldPreserveMessage) { XPathMessageQuery query5 = new XPathMessageQuery { Expression = string.Format(CultureInfo.InvariantCulture, "sm:correlation-data('{0}')", new object[] { data.Name }), Namespaces = new XPathMessageContext() }; MessageQuery query2 = query5; if (data.IsOptional) { OptionalMessageQuery query3 = new OptionalMessageQuery { Query = query2 }; query2 = query3; } if (query == null) { MessageFilter filter; bool flag = data.Name == "wsc-instanceId"; if (!shouldPreserveMessage && !flag) { shouldPreserveMessage = true; } if (action == "*") { filter = new MatchAllMessageFilter(); } else { filter = new ActionMessageFilter(new string[] { action }); } CorrelationQuery query4 = new CorrelationQuery { Where = filter, IsDefaultContextQuery = flag }; MessageQuerySet set = new MessageQuerySet(); set.Add(data.Name, query2); query4.Select = set; return(query4); } query.Select[data.Name] = query2; return(query); }
protected override IDuplexChannel OnCreateChannel(EndpointAddress address, Uri via) { EndpointAddress localAddress; int priority; MessageFilter filter; bool usesUniqueHeader = false; if (this.localAddressProvider != null) { localAddress = this.localAddressProvider.LocalAddress; filter = this.localAddressProvider.Filter; priority = this.localAddressProvider.Priority; } else { usesUniqueHeader = this.CreateUniqueLocalAddress(out localAddress, out priority); filter = new MatchAllMessageFilter(); } return(this.CreateChannel(address, via, localAddress, filter, priority, usesUniqueHeader)); }
private static RoutingConfiguration GetRoutingConfig() { var routingConfig = new RoutingConfiguration(); var filter = new MatchAllMessageFilter(); var endpoints = new List <ServiceEndpoint>(); foreach (EndpointAddress address in FindServiceAddresses()) { Console.WriteLine("Adding config for endpoint at address {0}", address.Uri); Binding binding = new BasicHttpBinding(); binding.ReceiveTimeout = TimeSpan.FromMilliseconds(100); binding.SendTimeout = TimeSpan.FromMilliseconds(100); binding.CloseTimeout = TimeSpan.FromMilliseconds(100); binding.OpenTimeout = TimeSpan.FromMilliseconds(100); ContractDescription description = ContractDescription.GetContract(typeof(IEchoService)); endpoints.Add(new ServiceEndpoint(description, binding, address)); } routingConfig.FilterTable.Add(filter, endpoints, 2); return(routingConfig); }
protected override IDuplexChannel OnCreateChannel(EndpointAddress address, Uri via) { EndpointAddress localAddress; int priority; MessageFilter filter; // determines whether the CompositeDuplex channels created from this factory expect the UniqueEndpoint (ChannelInstance) header in its messages bool useUniqueHeader = false; if (localAddressProvider != null) { localAddress = localAddressProvider.LocalAddress; filter = localAddressProvider.Filter; priority = localAddressProvider.Priority; } else { useUniqueHeader = CreateUniqueLocalAddress(out localAddress, out priority); filter = new MatchAllMessageFilter(); } return(this.CreateChannel(address, via, localAddress, filter, priority, useUniqueHeader)); }