Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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));
        }
Example #7
0
        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);
        }
Example #8
0
        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));
        }