/// <summary> /// Updates the endpoint description. /// </summary> public void Update(EndpointDescription description) { if (description == null) { throw new ArgumentNullException(nameof(description)); } m_description = (EndpointDescription)description.MemberwiseClone(); // normalize transport profile uri. if (m_description.TransportProfileUri != null) { m_description.TransportProfileUri = Profiles.NormalizeUri(m_description.TransportProfileUri); } // set the proxy url. if (m_collection != null && m_description.EndpointUrl != null) { if (m_description.EndpointUrl.StartsWith(Utils.UriSchemeOpcTcp, StringComparison.Ordinal)) { m_description.ProxyUrl = m_collection.TcpProxyUrl; } } }
/// <summary> /// Loads a collection of endpoints from a file. /// </summary> public static ConfiguredEndpointCollection Load(string filePath) { // load from file. ConfiguredEndpointCollection endpoints; using (Stream stream = File.OpenRead(filePath)) { endpoints = Load(stream); } endpoints.m_filepath = filePath; // remove invalid endpoints and ensure server descriptions are consistent. List <ConfiguredEndpoint> endpointsToRemove = new List <ConfiguredEndpoint>(); Dictionary <string, ApplicationDescription> servers = new Dictionary <string, ApplicationDescription>(); foreach (ConfiguredEndpoint endpoint in endpoints.m_endpoints) { if (endpoint.Description == null) { endpointsToRemove.Add(endpoint); continue; } // set a default value for the server. if (endpoint.Description.Server == null) { endpoint.Description.Server = new ApplicationDescription(); endpoint.Description.Server.ApplicationType = ApplicationType.Server; } // set a default for application uri. if (String.IsNullOrEmpty(endpoint.Description.Server.ApplicationUri)) { endpoint.Description.Server.ApplicationUri = endpoint.Description.EndpointUrl; } if (endpoint.Description.Server.DiscoveryUrls == null) { endpoint.Description.Server.DiscoveryUrls = new StringCollection(); } if (endpoint.Description.Server.DiscoveryUrls.Count == 0) { string discoveryUrl = endpoint.Description.EndpointUrl; if (!discoveryUrl.StartsWith(Utils.UriSchemeOpcTcp)) { discoveryUrl += "/discovery"; } endpoint.Description.Server.DiscoveryUrls.Add(discoveryUrl); } // normalize transport profile uri. if (endpoint.Description.TransportProfileUri != null) { endpoint.Description.TransportProfileUri = Profiles.NormalizeUri(endpoint.Description.TransportProfileUri); } ApplicationDescription server = null; if (!servers.TryGetValue(endpoint.Description.Server.ApplicationUri, out server)) { // use the first description in the file as the correct master. server = endpoint.Description.Server; servers[server.ApplicationUri] = server; // check if the server uri needs to be made globally unique. server.ApplicationUri = Utils.UpdateInstanceUri(server.ApplicationUri); servers[server.ApplicationUri] = server; continue; } endpoint.Description.Server = (ApplicationDescription)server.MemberwiseClone(); } // remove invalid endpoints. foreach (ConfiguredEndpoint endpoint in endpointsToRemove) { endpoints.Remove(endpoint); } // return processed collection. return(endpoints); }