/// <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); }
/// <summary> /// Creates a new endpoint from a url that is not part of the collection. /// </summary> /// <remarks> /// Call the Add() method to add it to the collection. /// </remarks> public ConfiguredEndpoint Create(string url) { // check for security parameters appended to the URL string parameters = null; int index = url.IndexOf("- [", StringComparison.Ordinal); if (index != -1) { parameters = url.Substring(index + 3); url = url.Substring(0, index).Trim(); } MessageSecurityMode securityMode = MessageSecurityMode.SignAndEncrypt; string securityPolicyUri = SecurityPolicies.Basic128Rsa15; bool useBinaryEncoding = true; if (!String.IsNullOrEmpty(parameters)) { string[] fields = parameters.Split(new char[] { '-', '[', ':', ']' }, StringSplitOptions.RemoveEmptyEntries); try { if (fields.Length > 0) { securityMode = (MessageSecurityMode)Enum.Parse(typeof(MessageSecurityMode), fields[0], false); } else { securityMode = MessageSecurityMode.None; } } catch { securityMode = MessageSecurityMode.None; } try { if (fields.Length > 1) { securityPolicyUri = SecurityPolicies.GetUri(fields[1]); } else { securityPolicyUri = SecurityPolicies.None; } } catch { securityPolicyUri = SecurityPolicies.None; } try { if (fields.Length > 2) { useBinaryEncoding = fields[2] == "Binary"; } else { useBinaryEncoding = false; } } catch { useBinaryEncoding = false; } } Uri uri = new Uri(url); EndpointDescription description = new EndpointDescription(); description.EndpointUrl = uri.ToString(); description.SecurityMode = securityMode; description.SecurityPolicyUri = securityPolicyUri; description.Server.ApplicationUri = Utils.UpdateInstanceUri(uri.ToString()); description.Server.ApplicationName = uri.AbsolutePath; if (description.EndpointUrl.StartsWith(Utils.UriSchemeOpcTcp, StringComparison.Ordinal)) { description.TransportProfileUri = Profiles.UaTcpTransport; description.Server.DiscoveryUrls.Add(description.EndpointUrl); } else if (description.EndpointUrl.StartsWith(Utils.UriSchemeHttps, StringComparison.Ordinal)) { description.TransportProfileUri = Profiles.HttpsBinaryTransport; description.Server.DiscoveryUrls.Add(description.EndpointUrl); } ConfiguredEndpoint endpoint = new ConfiguredEndpoint(this, description, null); endpoint.Configuration.UseBinaryEncoding = useBinaryEncoding; endpoint.UpdateBeforeConnect = true; return(endpoint); }