Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Description / ServiceDescription.cs / 1 / ServiceDescription.cs
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------
namespace System.ServiceModel.Description
{
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.Reflection;
using System.Diagnostics;
using System.Security;
using System.Security.Permissions;
[DebuggerDisplay("ServiceType={serviceType}")]
public class ServiceDescription
{
KeyedByTypeCollection behaviors = new KeyedByTypeCollection();
string configurationName;
ServiceEndpointCollection endpoints = new ServiceEndpointCollection();
Type serviceType;
XmlName serviceName;
string serviceNamespace = NamingHelper.DefaultNamespace;
public ServiceDescription()
{
}
internal ServiceDescription(String serviceName)
{
if (String.IsNullOrEmpty(serviceName))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceName");
this.Name = serviceName;
}
public ServiceDescription(IEnumerable endpoints)
: this()
{
if (endpoints == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("endpoints");
foreach (ServiceEndpoint endpoint in endpoints)
this.endpoints.Add(endpoint);
}
public string Name
{
get
{
if (serviceName != null)
return serviceName.EncodedName;
else if (ServiceType != null)
return NamingHelper.XmlName(ServiceType.Name);
else
return NamingHelper.DefaultServiceName;
}
set
{
if (string.IsNullOrEmpty(value))
{
serviceName = null;
}
else
{
// the XmlName ctor validate the value
serviceName = new XmlName(value, true /*isEncoded*/);
}
}
}
public string Namespace
{
get
{
return serviceNamespace;
}
set
{
serviceNamespace = value;
}
}
public KeyedByTypeCollection Behaviors
{
get { return this.behaviors; }
}
public string ConfigurationName
{
get { return this.configurationName; }
set
{
if (value == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
}
this.configurationName = value;
}
}
public ServiceEndpointCollection Endpoints
{
get { return this.endpoints; }
}
public Type ServiceType
{
get { return this.serviceType; }
set { this.serviceType = value; }
}
static void AddBehaviors(ServiceDescription serviceDescription)
{
Type type = serviceDescription.ServiceType;
System.ServiceModel.Description.TypeLoader.ApplyServiceInheritance>(
type, serviceDescription.Behaviors, ServiceDescription.GetIServiceBehaviorAttributes);
ServiceBehaviorAttribute serviceBehavior = EnsureBehaviorAttribute(serviceDescription);
if (serviceBehavior.Name != null)
serviceDescription.Name = new XmlName(serviceBehavior.Name).EncodedName;
if (serviceBehavior.Namespace != null)
serviceDescription.Namespace = serviceBehavior.Namespace;
if (String.IsNullOrEmpty(serviceBehavior.ConfigurationName))
{
serviceDescription.ConfigurationName = type.FullName;
}
else
{
serviceDescription.ConfigurationName = serviceBehavior.ConfigurationName;
}
if (ServiceHostingEnvironment.IsHosted)
{
AspNetCompatibilityRequirementsAttribute aspNetCompatibilityRequirements = serviceDescription.Behaviors.Find();
if (aspNetCompatibilityRequirements == null)
{
aspNetCompatibilityRequirements = new AspNetCompatibilityRequirementsAttribute();
serviceDescription.Behaviors.Add(aspNetCompatibilityRequirements);
}
}
}
internal static object CreateImplementation(Type serviceType)
{
ConstructorInfo constructor = serviceType.GetConstructor(
TypeLoader.DefaultBindingFlags, null, Type.EmptyTypes, null);
if (constructor == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(
SR.GetString(SR.SFxNoDefaultConstructor)));
}
try
{
object implementation = constructor.Invoke(
TypeLoader.DefaultBindingFlags, null, null, System.Globalization.CultureInfo.InvariantCulture);
return implementation;
}
catch (MethodAccessException methodAccessException)
{
SecurityException securityException = methodAccessException.InnerException as SecurityException;
if (securityException != null && securityException.PermissionType.Equals(typeof(ReflectionPermission)))
{
if (DiagnosticUtility.ShouldTraceWarning)
{
DiagnosticUtility.ExceptionUtility.TraceHandledException(methodAccessException, TraceEventType.Warning);
}
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
new SecurityException(SR.GetString(
SR.PartialTrustServiceCtorNotVisible,
serviceType.FullName)));
}
else
{
throw;
}
}
}
static ServiceBehaviorAttribute EnsureBehaviorAttribute(ServiceDescription description)
{
ServiceBehaviorAttribute attr = description.Behaviors.Find();
if (attr == null)
{
attr = new ServiceBehaviorAttribute();
description.Behaviors.Insert(0, attr);
}
return attr;
}
// This method ensures that the description object graph is structurally sound and that none
// of the fundamental SFx framework assumptions have been violated.
internal void EnsureInvariants()
{
for (int i = 0; i < this.Endpoints.Count; i++)
{
ServiceEndpoint endpoint = this.Endpoints[i];
if (endpoint == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.AChannelServiceEndpointIsNull0)));
}
endpoint.EnsureInvariants();
}
}
static void GetIServiceBehaviorAttributes(Type currentServiceType, KeyedByTypeCollection behaviors)
{
foreach (IServiceBehavior behaviorAttribute in ServiceReflector.GetCustomAttributes(currentServiceType, typeof(IServiceBehavior)))
{
behaviors.Add(behaviorAttribute);
}
}
public static ServiceDescription GetService(Type serviceType)
{
if (serviceType == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceType");
}
if (!serviceType.IsClass)
{
throw new ArgumentException(SR.GetString(SR.SFxServiceHostNeedsClass));
}
ServiceDescription description = new ServiceDescription();
description.ServiceType = serviceType;
AddBehaviors(description);
SetupSingleton(description, null, false);
return description;
}
public static ServiceDescription GetService(object serviceImplementation)
{
if (serviceImplementation == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceImplementation");
}
Type serviceType = serviceImplementation.GetType();
ServiceDescription description = new ServiceDescription();
description.ServiceType = serviceType;
if (serviceImplementation is IServiceBehavior)
{
description.Behaviors.Add((IServiceBehavior)serviceImplementation);
}
AddBehaviors(description);
SetupSingleton(description, serviceImplementation, true);
return description;
}
static void SetupSingleton(ServiceDescription serviceDescription, object implementation, bool isWellKnown)
{
ServiceBehaviorAttribute serviceBehavior = EnsureBehaviorAttribute(serviceDescription);
Type type = serviceDescription.ServiceType;
if ((implementation == null) && (serviceBehavior.InstanceContextMode == InstanceContextMode.Single))
{
implementation = CreateImplementation(type);
}
if (isWellKnown)
{
serviceBehavior.SetWellKnownSingleton(implementation);
}
else if ((implementation != null) && (serviceBehavior.InstanceContextMode == InstanceContextMode.Single))
{
serviceBehavior.SetHiddenSingleton(implementation);
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlUnspecifiedAttribute.cs
- EntityContainerAssociationSetEnd.cs
- CodeMemberMethod.cs
- _BufferOffsetSize.cs
- CompilerGlobalScopeAttribute.cs
- SettingsProperty.cs
- ControlType.cs
- HwndSourceParameters.cs
- PasswordBox.cs
- ListenerElementsCollection.cs
- DataControlFieldCell.cs
- JsonServiceDocumentSerializer.cs
- QueryAccessibilityHelpEvent.cs
- XpsS0ValidatingLoader.cs
- OdbcDataReader.cs
- DrawingAttributeSerializer.cs
- ViewStateModeByIdAttribute.cs
- ProtocolsSection.cs
- PerformanceCounterPermission.cs
- RangeValuePattern.cs
- MetadataItem.cs
- ContentValidator.cs
- MethodBuilderInstantiation.cs
- ISAPIRuntime.cs
- XAMLParseException.cs
- ControlDesignerState.cs
- BaseDataBoundControl.cs
- ObservableCollection.cs
- Decimal.cs
- MasterPage.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- DataBindingList.cs
- TransactionWaitAsyncResult.cs
- OracleString.cs
- Pen.cs
- SmiMetaDataProperty.cs
- DataObjectSettingDataEventArgs.cs
- MessageEncodingBindingElement.cs
- KnownTypesHelper.cs
- SelectedCellsCollection.cs
- DomNameTable.cs
- ObjectConverter.cs
- ValueTable.cs
- ThreadExceptionEvent.cs
- BitmapSizeOptions.cs
- TextViewSelectionProcessor.cs
- PenThread.cs
- TextView.cs
- StateDesignerConnector.cs
- LookupBindingPropertiesAttribute.cs
- ActivityCodeDomReferenceService.cs
- FileDialog_Vista_Interop.cs
- SqlConnectionFactory.cs
- DataException.cs
- exports.cs
- Transactions.cs
- MLangCodePageEncoding.cs
- ThreadStartException.cs
- WindowAutomationPeer.cs
- LinqDataSourceSelectEventArgs.cs
- Comparer.cs
- VariableDesigner.xaml.cs
- EventLogInternal.cs
- MenuItemStyleCollection.cs
- ClientRoleProvider.cs
- baseaxisquery.cs
- LinqDataSourceUpdateEventArgs.cs
- TextAction.cs
- TransformDescriptor.cs
- DataGridRowsPresenter.cs
- BitmapCodecInfo.cs
- XmlChildEnumerator.cs
- StyleXamlParser.cs
- LoadedOrUnloadedOperation.cs
- HttpCapabilitiesEvaluator.cs
- EventLogPermissionEntry.cs
- StyleCollectionEditor.cs
- TransformCollection.cs
- Stroke.cs
- ProfileSection.cs
- RegistryPermission.cs
- DoubleConverter.cs
- PathNode.cs
- XmlnsDefinitionAttribute.cs
- MappingMetadataHelper.cs
- Documentation.cs
- DateRangeEvent.cs
- DbProviderManifest.cs
- FontFamilyValueSerializer.cs
- PrintEvent.cs
- ProvideValueServiceProvider.cs
- SqlCharStream.cs
- UpdatePanelControlTrigger.cs
- BinaryObjectReader.cs
- MasterPageCodeDomTreeGenerator.cs
- ServerIdentity.cs
- ListDictionary.cs
- Exception.cs
- DatatypeImplementation.cs
- ExpressionBuilderCollection.cs