protected override IList<ServiceHost> InitializeServiceHosts(
ApplicationConfiguration configuration,
BindingFactory bindingFactory,
out ApplicationDescription serverDescription,
out EndpointDescriptionCollection endpoints)
{
serverDescription = null;
endpoints = null;
Dictionary<string,ServiceHost> hosts = new Dictionary<string,ServiceHost>();
// ensure at least one security policy exists.
if (configuration.ServerConfiguration.SecurityPolicies.Count == 0)
{
configuration.ServerConfiguration.SecurityPolicies.Add(new ServerSecurityPolicy());
}
// ensure at least one user token policy exists.
if (configuration.ServerConfiguration.UserTokenPolicies.Count == 0)
{
UserTokenPolicy userTokenPolicy = new UserTokenPolicy();
userTokenPolicy.TokenType = UserTokenType.Anonymous;
userTokenPolicy.PolicyId = userTokenPolicy.TokenType.ToString();
configuration.ServerConfiguration.UserTokenPolicies.Add(userTokenPolicy);
}
// set server description.
serverDescription = new ApplicationDescription();
serverDescription.ApplicationUri = configuration.ApplicationUri;
serverDescription.ApplicationName = configuration.ApplicationName;
serverDescription.ApplicationType = configuration.ApplicationType;
serverDescription.ProductUri = configuration.ProductUri;
serverDescription.DiscoveryUrls = GetDiscoveryUrls();
endpoints = new EndpointDescriptionCollection();
IList<EndpointDescription> endpointsForHost = null;
// create hosts for protocols that require one endpoints per security policy
foreach (ServerSecurityPolicy securityPolicy in configuration.ServerConfiguration.SecurityPolicies)
{
endpointsForHost = CreateSinglePolicyServiceHost(
hosts,
configuration,
bindingFactory,
configuration.ServerConfiguration.BaseAddresses,
serverDescription,
securityPolicy.SecurityMode,
securityPolicy.SecurityPolicyUri,
String.Empty);
for (int ii = 0; ii < endpointsForHost.Count; ii++)
{
endpointsForHost[ii].SecurityLevel = securityPolicy.SecurityLevel;
}
endpoints.AddRange(endpointsForHost);
}
// create UA TCP host.
endpointsForHost = CreateUaTcpServiceHost(
hosts,
configuration,
bindingFactory,
configuration.ServerConfiguration.BaseAddresses,
serverDescription,
configuration.ServerConfiguration.SecurityPolicies);
endpoints.InsertRange(0, endpointsForHost);
// create HTTPS host.
endpointsForHost = CreateHttpsServiceHost(
hosts,
configuration,
bindingFactory,
configuration.ServerConfiguration.BaseAddresses,
serverDescription,
configuration.ServerConfiguration.SecurityPolicies);
endpoints.AddRange(endpointsForHost);
return new List<ServiceHost>(hosts.Values);
}