//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- namespace System.ServiceModel { using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime; using System.ServiceModel.Activities; using System.ServiceModel.Channels; using System.ServiceModel.XamlIntegration; using System.Xml.Linq; using SMASR = System.ServiceModel.Activities.SR; public class Endpoint { Collection headers; [DefaultValue(null)] public string BehaviorConfigurationName { get; set; } [Fx.Tag.KnownXamlExternal] [DefaultValue(null)] public Binding Binding { get; set; } [DefaultValue(null)] [TypeConverter(typeof(ServiceXNameTypeConverter))] public XName ServiceContractName { get; set; } // concrete AddressHeader descendants aren't currently XAMLable, they are not initialized until runtime // If user adds an address header, this object will fail to xamlize. [Fx.Tag.KnownXamlExternal] public Collection Headers { get { if (this.headers == null) { this.headers = new Collection(); } return this.headers; } } [DefaultValue(null)] [TypeConverter(typeof(EndpointIdentityConverter))] public EndpointIdentity Identity { get; set; } [DefaultValue(null)] public Uri ListenUri { get; set; } [DefaultValue(null)] public string Name { get; set; } [DefaultValue(null)] public Uri AddressUri { get; set; } public EndpointAddress GetAddress() { return GetAddress(null); } public EndpointAddress GetAddress(ServiceHostBase host) { if (this.AddressUri == null) { string endpointName = ContractValidationHelper.GetErrorMessageEndpointName(this.Name); string contractName = ContractValidationHelper.GetErrorMessageEndpointServiceContractName(this.ServiceContractName); throw FxTrace.Exception.AsError(new InvalidOperationException( SMASR.MissingUriInEndpoint(endpointName, contractName))); } Uri address = null; if (this.AddressUri.IsAbsoluteUri) { address = this.AddressUri; } else { if (this.Binding == null) { string endpointName = ContractValidationHelper.GetErrorMessageEndpointName(this.Name); string contractName = ContractValidationHelper.GetErrorMessageEndpointServiceContractName(this.ServiceContractName); throw FxTrace.Exception.AsError(new InvalidOperationException( SMASR.RelativeUriRequiresBinding(endpointName, contractName, this.AddressUri))); } if (host == null) { string endpointName = ContractValidationHelper.GetErrorMessageEndpointName(this.Name); string contractName = ContractValidationHelper.GetErrorMessageEndpointServiceContractName(this.ServiceContractName); throw FxTrace.Exception.AsError(new InvalidOperationException( SMASR.RelativeUriRequiresHost(endpointName, contractName, this.AddressUri))); } address = host.MakeAbsoluteUri(this.AddressUri, this.Binding); } return new EndpointAddress(address, this.Identity, new AddressHeaderCollection(this.Headers)); } } }