In this chapter, you have seen how the WCF runtime for a service determines how to handle an incoming message. The ChannelDispatcher object receiving the message queries each of its EndpointDispatcher objects in turn. An EndpointDispatcher exposes the AddressFilter and ContractFilter properties that the ChannelDispatcher can use to ascertain whether the EndpointDispatcher can accept the message. The EndpointDispatcher selected to process the message invokes the appropriate method in the service. You can customize the way in which the EndpointDispatcher accepts and processes messages by providing your own AddressFilter and ContractFilter objects and implementing the IDispatchOperationSelector interface.
You have also seen how to define a very generalized WCF service that can act as a router for other services, implementing a method that can accept almost any message and forwarding it for processing elsewhere.
Finally, you have seen how the infrastructure provided by WCF conforms to the WS-Addressing specification, when using the WSHttpBinding binding. This enables you to accept and route messages to and from applications and services created by using other technologies.