Opc.Ua.ServerBase.CreateSinglePolicyServiceHost C# (CSharp) Method

CreateSinglePolicyServiceHost() protected method

Create a new service host for protocols that support only one policy per host.
protected CreateSinglePolicyServiceHost ( ServiceHost>.IDictionary hosts, ApplicationConfiguration configuration, BindingFactory bindingFactory, IList baseAddresses, ApplicationDescription serverDescription, MessageSecurityMode securityMode, string securityPolicyUri, string basePath ) : List
hosts ServiceHost>.IDictionary The hosts.
configuration ApplicationConfiguration The configuration.
bindingFactory BindingFactory The binding factory.
baseAddresses IList The base addresses.
serverDescription ApplicationDescription The server description.
securityMode MessageSecurityMode The security mode.
securityPolicyUri string The security policy URI.
basePath string The base path to use when constructing the hosts.
return List
        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;
        }