protected List<EndpointDescription> CreateSinglePolicyServiceHost(
IDictionary<string, ServiceHost> hosts,
ApplicationConfiguration configuration,
BindingFactory bindingFactory,
IList<string> baseAddresses,
ApplicationDescription serverDescription,
MessageSecurityMode securityMode,
string securityPolicyUri,
string basePath)
{
// generate a unique host name.
string hostName = basePath;
if (hosts.ContainsKey(hostName))
{
hostName += Utils.Format("/{0}", SecurityPolicies.GetDisplayName(securityPolicyUri));
}
if (hosts.ContainsKey(hostName))
{
hostName += Utils.Format("/{0}", securityMode);
}
if (hosts.ContainsKey(hostName))
{
hostName += Utils.Format("/{0}", hosts.Count);
}
// build list of uris.
List<Uri> uris = new List<Uri>();
List<EndpointDescription> endpoints = new List<EndpointDescription>();
string computerName = System.Net.Dns.GetHostName();
for (int ii = 0; ii < baseAddresses.Count; ii++)
{
// UA TCP and HTTPS endpoints have their own host.
if (baseAddresses[ii].StartsWith(Utils.UriSchemeOpcTcp, StringComparison.Ordinal) ||
baseAddresses[ii].StartsWith(Utils.UriSchemeHttps, StringComparison.Ordinal) ||
baseAddresses[ii].StartsWith(Utils.UriSchemeNoSecurityHttp, StringComparison.Ordinal))
{
continue;
}
UriBuilder uri = new UriBuilder(baseAddresses[ii]);
if (String.Compare(uri.Host, "localhost", StringComparison.OrdinalIgnoreCase) == 0)
{
uri.Host = computerName;
}
uri.Path += hostName;
uris.Add(uri.Uri);
// create the endpoint description.
EndpointDescription description = new EndpointDescription();
description.EndpointUrl = uri.ToString();
description.Server = serverDescription;
description.SecurityMode = securityMode;
description.SecurityPolicyUri = securityPolicyUri;
description.TransportProfileUri = Profiles.WsHttpXmlTransport;
description.UserIdentityTokens = GetUserTokenPolicies(configuration, description);
bool requireEncryption = RequireEncryption(description);
if (!requireEncryption)
{
foreach (UserTokenPolicy userTokenPolicy in description.UserIdentityTokens)
{
if (userTokenPolicy.SecurityPolicyUri != SecurityPolicies.None)
{
requireEncryption = true;
break;
}
}
}
if (requireEncryption)
{
if (InstanceCertificate == null)
{
throw new ServiceResultException( StatusCodes.BadConfigurationError,
"Server does not have an instance certificate assigned." );
}
description.ServerCertificate = InstanceCertificate.RawData;
//if (InstanceCertificateChain != null)
//{
// List<byte> certificateChainList = new List<byte>();
// for (int i = 0; i < InstanceCertificateChain.Count; i++)
// {
// certificateChainList.AddRange(InstanceCertificateChain[i].RawData);
// }
// description.ServerCertificate = certificateChainList.ToArray();
//}
}
endpoints.Add(description);
}
// check if nothing to do.
if (uris.Count == 0)
{
return endpoints;
}
// create the host.
ServiceHost serviceHost = CreateServiceHost(this, uris.ToArray());
// create the endpoint configuration to use.
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);
// initialize the host.
serviceHost.InitializeSinglePolicy(
GetServiceContract(),
configuration,
bindingFactory,
endpointConfiguration,
endpoints,
securityMode,
securityPolicyUri);
if (String.IsNullOrEmpty(hostName))
{
serviceHost.InitializeDiscovery(configuration, serverDescription.DiscoveryUrls);
}
// save in server list.
hosts[hostName] = serviceHost;
return endpoints;
}