//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Administration { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.IO; using System.Runtime; using System.ServiceModel; using System.ServiceModel.Description; sealed class ServiceInfo { KeyedByTypeCollection behaviors; EndpointInfoCollection endpoints; ServiceHostBase service; string serviceName; internal ServiceInfo(ServiceHostBase service) { this.service = service; this.behaviors = service.Description.Behaviors; this.serviceName = service.Description.Name; this.endpoints = new EndpointInfoCollection(service.Description.Endpoints, this.ServiceName); } public string ConfigurationName { get { return this.service.Description.ConfigurationName; } } public string DistinguishedName { get { return this.serviceName + "@" + this.FirstAddress; } } public string FirstAddress { get { Fx.Assert(null != this.Service.BaseAddresses, ""); string address = ""; if (this.Service.BaseAddresses.Count > 0) { Fx.Assert(null != this.Service.BaseAddresses[0], ""); address = this.Service.BaseAddresses[0].ToString(); } else if (this.Endpoints.Count > 0) { Uri addressUri = this.Endpoints[0].Address; if (null != addressUri) { address = addressUri.ToString(); } } return address; } } public string Name { get { return this.serviceName; } } public string Namespace { get { return this.service.Description.Namespace; } } public string ServiceName { get { return this.serviceName; } } public ServiceHostBase Service { get { return this.service; } } public KeyedByTypeCollection Behaviors { get { return this.behaviors; } } public CommunicationState State { get { return this.Service.State; } } public EndpointInfoCollection Endpoints { get { return this.endpoints; } } public string[] Metadata { get { string[] result = null; ServiceMetadataExtension metadataExtension = service.Extensions.Find(); if (null != metadataExtension) { Collection metadataStrings = new Collection(); try { foreach (MetadataSection section in metadataExtension.Metadata.MetadataSections) { using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) { if (section.Metadata is System.Web.Services.Description.ServiceDescription) { System.Web.Services.Description.ServiceDescription metadata = (System.Web.Services.Description.ServiceDescription)section.Metadata; metadata.Write(sw); metadataStrings.Add(sw.ToString()); } else if (section.Metadata is System.Xml.XmlElement) { System.Xml.XmlElement metadata = (System.Xml.XmlElement)section.Metadata; using (System.Xml.XmlWriter xmlWriter = System.Xml.XmlWriter.Create(sw)) { metadata.WriteTo(xmlWriter); metadataStrings.Add(sw.ToString()); } } else if (section.Metadata is System.Xml.Schema.XmlSchema) { System.Xml.Schema.XmlSchema metadata = (System.Xml.Schema.XmlSchema)section.Metadata; metadata.Write(sw); metadataStrings.Add(sw.ToString()); } else { metadataStrings.Add(section.Metadata.ToString()); } } } } catch (InvalidOperationException e) { metadataStrings.Add(e.ToString()); } result = new string[metadataStrings.Count]; metadataStrings.CopyTo(result, 0); } return result; } } } }