/// <summary> /// Updates the server descrption for the endpoints. /// </summary> public void SetApplicationDescription(string serverUri, ApplicationDescription server) { if (server == null) { throw new ArgumentNullException("server"); } if (String.IsNullOrEmpty(server.ApplicationUri)) { throw new ArgumentException("A ServerUri must provided.", "server"); } if (server.DiscoveryUrls.Count == 0) { throw new ArgumentException("At least one DiscoveryUrl must be provided.", "server"); } List <ConfiguredEndpoint> endpoints = GetEndpoints(server.ApplicationUri); // create a placeholder endpoint for the server description. if (endpoints.Count == 0) { string endpointUrl = null; for (int ii = 0; ii < server.DiscoveryUrls.Count; ii++) { if (!String.IsNullOrEmpty(server.DiscoveryUrls[ii])) { endpointUrl = server.DiscoveryUrls[ii]; break; } } if (endpointUrl != null && endpointUrl.EndsWith("/discovery", StringComparison.Ordinal)) { endpointUrl = endpointUrl.Substring(0, endpointUrl.Length - "/discovery".Length); } if (endpointUrl != null) { ConfiguredEndpoint endpoint = Create(endpointUrl); endpoint.Description.Server = (ApplicationDescription)server.MemberwiseClone(); Add(endpoint); } } // update all endpoints with the same server uri. else { foreach (ConfiguredEndpoint endpointToUpdate in GetEndpoints(serverUri)) { endpointToUpdate.Description.Server = (ApplicationDescription)server.MemberwiseClone(); } } }
/// <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); }