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

OnServerStarting() protected method

Called before the server starts.
protected OnServerStarting ( ApplicationConfiguration configuration ) : void
configuration ApplicationConfiguration The object that stores the configurable configuration information for a UA application.
return void
        protected virtual void OnServerStarting(ApplicationConfiguration configuration)
        {            
            // fetch properties and configuration.
            Configuration = configuration;
            ServerProperties = LoadServerProperties();
            
            // ensure at least one security policy exists.
            if (configuration.ServerConfiguration != null)
            {
                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);
                }
            }

            // load the instance certificate.
            if (configuration.SecurityConfiguration.ApplicationCertificate != null)
            {
                InstanceCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find(true);
            }

            if (InstanceCertificate == null)
            {
                throw new ServiceResultException(
                    StatusCodes.BadConfigurationError,
                    "Server does not have an instance certificate assigned.");
            }

            if (!InstanceCertificate.HasPrivateKey)
            {
                throw new ServiceResultException(
                    StatusCodes.BadConfigurationError,
                    "Server does not have access to the private key for the instance certificate.");
            }

            //load certificate chain
            //InstanceCertificateChain = new X509Certificate2Collection(InstanceCertificate);
            //List<CertificateIdentifier> issuers = new List<CertificateIdentifier>();
            //configuration.CertificateValidator.GetIssuers(InstanceCertificate, issuers);
            //for (int i = 0; i < issuers.Count; i++)
            //{
            //    InstanceCertificateChain.Add(issuers[i].Certificate);
            //}
            
            // use the message context from the configuration to ensure the channels are using the same one.
            MessageContext = configuration.CreateMessageContext();
            
            // assign a unique identifier if none specified.
            if (String.IsNullOrEmpty(configuration.ApplicationUri))
            {
                configuration.ApplicationUri = Utils.GetApplicationUriFromCertficate(InstanceCertificate);
                
                if (String.IsNullOrEmpty(configuration.ApplicationUri))
                {
                    configuration.ApplicationUri = Utils.Format(
                        "http://{0}/{1}/{2}", 
                        System.Net.Dns.GetHostName(),
                        configuration.ApplicationName, 
                        Guid.NewGuid());
                }
            }

            // initialize namespace table.
            MessageContext.NamespaceUris = new NamespaceTable();
            MessageContext.NamespaceUris.Append(configuration.ApplicationUri);
            
            // assign an instance name.
            if (String.IsNullOrEmpty(configuration.ApplicationName) && InstanceCertificate != null)
            {
                configuration.ApplicationName = InstanceCertificate.GetNameInfo(X509NameType.DnsName, false);
            }

            // save the certificate validator.
            CertificateValidator = configuration.CertificateValidator;
        }