xAddrs optionality in WS-Discovery messages
Traditional big web services, like a billing system or a service running in the cloud, nearly always have fixed addresses--often HTTP URLs. Smaller web services, such as those on a PC or a device, often have logical identifiers ("urn:uuid:c3de740f-9227-4706-b3ee-9494243c040d") that let you recognize the service, but which don't actually tell you anything about how to contact the service.
One of the great uses of WS-Discovery is transforming logical addresses into physical addresses (e.g., https://my_pc/service/) so you can actually contact the service. A service uses the xAddrs field in WS-Discovery messages to express its transport addresses.
But it turns out that these xAddrs are optional. There are actually a lot of really good cases why you would want to omit them--if they're very large, or if you don't want to generate different Hello messages for every IP address in the system--but the specification doesn't clearly explain when they're often omitted in the real world, and what happens when they are.
So let's go through the four messages a service can send.
- Hello messages sometimes contain xAddrs. On any given subnet it's likely to encounter Hello messages both with and without xAddrs. Those without xAddrs will cause a Resolve from any clients interested in the service. Hello is the only multicast message that can include xAddrs, so it's a little unique--and it differs from ProbeMatches and ResolveMatches in that sense.
- Bye messages never contain xAddrs. The specification does not allow it (note that this has been changed in WS-Discovery v1.1).
- ResolveMatches messages always contain xAddrs. It's technically possible for the xAddrs element to be empty but this is unusual and probably not a good way to achieve interoperability. A service must realistically always produce xAddrs in its ResolveMatches messages.
- ProbeMatches messages usually contain xAddrs. It's very unusual for services to omit xAddrs in their ProbeMatches messages because it takes no more effort than including them in ResolveMatches--both messages are unicast responses. Including xAddrs in ProbeMatches lets everyone avoid a Resolve/ResolveMatches exchange.
One interesting consequence of this is that the example sequence on page 11 of WS-Discovery (Probe -> ProbeMatches -> Resolve -> Resolve Matches -> success!) almost never happens. Services usually include xAddrs in their ProbeMatches messages in the first place.