protected IList<BaseAddress> FilterByEndpointUrl(Uri endpointUrl, IList<BaseAddress> baseAddresses)
{
// client gets all of the endpoints if it using a known variant of the hostname.
if (NormalizeHostname(endpointUrl.DnsSafeHost) == NormalizeHostname("localhost"))
{
return baseAddresses;
}
// client only gets alternate addresses that match the DNS name that it used.
List<BaseAddress> accessibleAddresses = new List<BaseAddress>();
foreach (BaseAddress baseAddress in baseAddresses)
{
if (baseAddress.Url.DnsSafeHost == endpointUrl.DnsSafeHost)
{
accessibleAddresses.Add(baseAddress);
continue;
}
if (baseAddress.AlternateUrls != null)
{
foreach (Uri alternateUrl in baseAddress.AlternateUrls)
{
if (alternateUrl.DnsSafeHost == endpointUrl.DnsSafeHost)
{
accessibleAddresses.Add(baseAddress);
break;
}
}
}
}
// no match on client DNS name. client gets only addresses that match the scheme.
if (accessibleAddresses.Count == 0)
{
foreach (BaseAddress baseAddress in baseAddresses)
{
if (baseAddress.Url.Scheme == endpointUrl.Scheme)
{
accessibleAddresses.Add(baseAddress);
continue;
}
}
}
return accessibleAddresses;
}