WCF by default adds
the listen address of the endpoints in the WSDL so in a scenario where the
private address of the server is different from the public address you get incorrect
endpoint address in WSDL.
For example if a service is listening on http://localhost:7721/ and you access its
metadata using a virtual IP http://102.212.0.117/?wsdl, you get following:

Now this behavior might not work in certain scenarios and
you want the metadata generation to dynamically pick the address from the request
headers, similar to ASMX web services.
UseRequestHeadersForMetadataAddressBehavior enables exactly this. This opt-in behavior
sets the address of endpoints dynamically, based on the request header.
Like all other WCF behaviors, this behavior can be enabled
either in the code or config.
sh.Description.Behaviors.Add(new UseRequestHeadersForMetadataAddressBehavior());
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<useRequestHeadersForMetadataAddress/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
This behavior is added in .NET 4.0 and there is a QFE available
for 3.5 SP1: http://support.microsoft.com/kb/971842