Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / ComIntegration / TypedServiceChannelBuilder.cs / 1 / TypedServiceChannelBuilder.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#pragma warning disable 1634, 1691
namespace System.ServiceModel.ComIntegration
{
using System;
using System.ServiceModel.Description;
using System.Reflection;
using System.Collections.Generic;
using System.Threading;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.ServiceModel.Diagnostics;
internal class TypedServiceChannelBuilder : IProxyCreator, IProvideChannelBuilderSettings, ICreateServiceChannel
{
ServiceChannelFactory serviceChannelFactory = null;
Type contractType = null;
RealProxy serviceProxy = null;
ServiceEndpoint serviceEndpoint = null;
KeyedByTypeCollection behaviors = new KeyedByTypeCollection();
Binding binding = null;
string configurationName = null ;
string address = null;
EndpointIdentity identity = null;
void IDisposable.Dispose ()
{
if (serviceProxy != null)
{
IChannel channel = serviceProxy.GetTransparentProxy () as IChannel;
if (channel == null)
{
DiagnosticUtility.DebugAssert("serviceProxy MUST support IChannel");
#pragma warning suppress 56519 //
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
channel.Close ();
}
}
//Suppressing PreSharp warning that property get methods should not throw
#pragma warning disable 6503
ServiceChannelFactory IProvideChannelBuilderSettings.ServiceChannelFactoryReadWrite
{
get
{
if (serviceProxy != null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError (new COMException (SR.GetString (SR.TooLate), HR.RPC_E_TOO_LATE));
return serviceChannelFactory;
}
}
#pragma warning restore 6503
ServiceChannelFactory IProvideChannelBuilderSettings.ServiceChannelFactoryReadOnly
{
get
{
return serviceChannelFactory;
}
}
//Suppressing PreSharp warning that property get methods should not throw
#pragma warning disable 6503
KeyedByTypeCollection IProvideChannelBuilderSettings.Behaviors
{
get
{
if (serviceProxy != null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError (new COMException (SR.GetString (SR.TooLate), HR.RPC_E_TOO_LATE));
return behaviors;
}
}
#pragma warning restore 6503
ServiceChannel IProvideChannelBuilderSettings.ServiceChannel
{
get
{
return null;
}
}
RealProxy ICreateServiceChannel.CreateChannel ()
{
if (serviceProxy == null)
{
lock (this)
{
if (serviceProxy == null)
{
try
{
if (serviceChannelFactory == null)
{
FaultInserviceChannelFactory();
}
if (serviceChannelFactory == null)
{
DiagnosticUtility.DebugAssert("ServiceChannelFactory cannot be null at this point");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
serviceChannelFactory.Open ();
if (contractType == null)
{
DiagnosticUtility.DebugAssert("contractType cannot be null");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
if (serviceEndpoint == null)
{
DiagnosticUtility.DebugAssert("serviceEndpoint cannot be null");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
object transparentProxy = serviceChannelFactory.CreateChannel (contractType, new EndpointAddress(serviceEndpoint.Address.Uri, serviceEndpoint.Address.Identity, serviceEndpoint.Address.Headers), serviceEndpoint.Address.Uri);
ComPlusChannelCreatedTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationChannelCreated,
SR.TraceCodeComIntegrationChannelCreated, serviceEndpoint.Address.Uri, contractType);
RealProxy localProxy = RemotingServices.GetRealProxy (transparentProxy);
Thread.MemoryBarrier();
serviceProxy = localProxy;
if (serviceProxy == null)
{
DiagnosticUtility.DebugAssert("serviceProxy MUST derive from RealProxy");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
}
finally
{
if ((serviceProxy == null) && (serviceChannelFactory != null))
serviceChannelFactory.Close ();
}
}
}
}
return serviceProxy;
}
private ServiceEndpoint CreateServiceEndpoint()
{
TypeLoader loader = new TypeLoader();
ContractDescription contractDescription = loader.LoadContractDescription(contractType);
ServiceEndpoint endpoint = new ServiceEndpoint(contractDescription);
if (address != null)
endpoint.Address = new EndpointAddress(new Uri(address), identity);
if (binding != null)
endpoint.Binding = binding;
if (configurationName != null)
{
ConfigLoader configLoader = new ConfigLoader();
configLoader.LoadChannelBehaviors(endpoint, configurationName);
}
ComPlusTypedChannelBuilderTrace.Trace(TraceEventType.Verbose, TraceCode.ComIntegrationTypedChannelBuilderLoaded,
SR.TraceCodeComIntegrationTypedChannelBuilderLoaded, contractType, binding);
return endpoint;
}
private ServiceChannelFactory CreateServiceChannelFactory ()
{
ServiceChannelFactory serviceChannelFactory = ServiceChannelFactory.BuildChannelFactory(serviceEndpoint) as ServiceChannelFactory;
if (serviceChannelFactory == null)
{
DiagnosticUtility.DebugAssert("We should get a ServiceChannelFactory back");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
return serviceChannelFactory;
}
void FaultInserviceChannelFactory ()
{
if (contractType == null)
{
DiagnosticUtility.DebugAssert("contractType should not be null");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
if (serviceEndpoint == null)
{
serviceEndpoint = CreateServiceEndpoint();
}
foreach (IEndpointBehavior behavior in behaviors)
serviceEndpoint.Behaviors.Add(behavior);
serviceChannelFactory = CreateServiceChannelFactory ();
}
internal void ResolveTypeIfPossible (Dictionary propertyTable )
{
string typeIID;
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.Contract, out typeIID);
Guid iid;
if (!string.IsNullOrEmpty(typeIID))
{
try
{
dispatchEnabled = true;
iid = new Guid (typeIID);
TypeCacheManager.Provider.FindOrCreateType (iid, out contractType, true, false);
serviceEndpoint = CreateServiceEndpoint();
}
catch (Exception e)
{
if (DiagnosticUtility.IsFatal(e))
throw;
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException (SR.GetString(SR.TypeLoadForContractTypeIIDFailedWith, typeIID, e.Message)));
}
}
}
internal TypedServiceChannelBuilder (Dictionary propertyTable )
{
string bindingType = null;
string bindingConfigName = null;
string spnIdentity = null;
string upnIdentity = null;
string dnsIdentity = null;
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.Address, out address);
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.Binding, out bindingType);
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.BindingConfiguration, out bindingConfigName);
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.SpnIdentity, out spnIdentity);
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.UpnIdentity, out upnIdentity);
propertyTable.TryGetValue (MonikerHelper.MonikerAttribute.DnsIdentity, out dnsIdentity);
if (!string.IsNullOrEmpty(bindingType))
{
try
{
binding = ConfigLoader.LookupBinding (bindingType, bindingConfigName);
}
catch (Exception e)
{
if (DiagnosticUtility.IsFatal(e))
throw;
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException (SR.GetString(SR.BindingLoadFromConfigFailedWith, bindingType, e.Message)));
}
if (binding == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException (SR.GetString(SR.BindingNotFoundInConfig, bindingType, bindingConfigName)));
}
if (binding == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.BindingNotSpecified)));
if (string.IsNullOrEmpty(address))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MonikerSyntaxException(SR.GetString(SR.AddressNotSpecified)));
if (!string.IsNullOrEmpty(spnIdentity ))
{
if ((!string.IsNullOrEmpty(upnIdentity))||(!string.IsNullOrEmpty(dnsIdentity)))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError (new MonikerSyntaxException (SR.GetString (SR.MonikerIncorrectServerIdentity)));
identity = EndpointIdentity.CreateSpnIdentity(spnIdentity);
}
else if (!string.IsNullOrEmpty(upnIdentity))
{
if ((!string.IsNullOrEmpty(spnIdentity))||(!string.IsNullOrEmpty(dnsIdentity)))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError (new MonikerSyntaxException (SR.GetString (SR.MonikerIncorrectServerIdentity)));
identity = EndpointIdentity.CreateUpnIdentity(upnIdentity);
}
else if (!string.IsNullOrEmpty(dnsIdentity))
{
if ((!string.IsNullOrEmpty(spnIdentity))||(!string.IsNullOrEmpty(upnIdentity)))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError (new MonikerSyntaxException (SR.GetString (SR.MonikerIncorrectServerIdentity)));
identity = EndpointIdentity.CreateDnsIdentity(dnsIdentity);
}
else
identity = null;
ResolveTypeIfPossible (propertyTable);
}
bool dispatchEnabled = false;
private bool CheckDispatch (ref Guid riid)
{
if ((dispatchEnabled) && (riid == InterfaceID.idIDispatch))
return true;
else
return false;
}
ComProxy IProxyCreator.CreateProxy (IntPtr outer, ref Guid riid)
{
if (outer == IntPtr.Zero)
{
DiagnosticUtility.DebugAssert("OuterProxy cannot be null");
throw DiagnosticUtility.ExceptionUtility.ThrowHelperInternal(false);
}
// No contract Fault on in
if (contractType == null)
TypeCacheManager.Provider.FindOrCreateType (riid, out contractType, true, false);
if ((contractType.GUID != riid) && !(CheckDispatch (ref riid)))
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidCastException(SR.GetString(SR.NoInterface, riid)));
Type proxiedType = EmitterCache.TypeEmitter.FindOrCreateType (contractType);
ComProxy comProxy = null;
TearOffProxy tearoffProxy = null;
try
{
tearoffProxy = new TearOffProxy (this , proxiedType);
comProxy = ComProxy.Create (outer, tearoffProxy.GetTransparentProxy(), tearoffProxy);
return comProxy;
}
finally
{
if ((comProxy == null) && (tearoffProxy != null))
((IDisposable)tearoffProxy).Dispose ();
}
}
bool IProxyCreator.SupportsErrorInfo (ref Guid riid)
{
if (contractType == null)
return false;
else
{
if ((contractType.GUID != riid) && !(CheckDispatch (ref riid)))
return false;
else
return true;
}
}
bool IProxyCreator.SupportsDispatch ()
{
return dispatchEnabled;
}
bool IProxyCreator.SupportsIntrinsics ()
{
return true;
}
}
}
// 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
- DBSchemaTable.cs
- PtsHost.cs
- WebHttpBindingElement.cs
- AnyAllSearchOperator.cs
- RepeatBehaviorConverter.cs
- BitmapPalette.cs
- webproxy.cs
- TextDecoration.cs
- ListViewGroup.cs
- AnnotationService.cs
- IndexedDataBuffer.cs
- CqlIdentifiers.cs
- WebHttpElement.cs
- X509Extension.cs
- CreatingCookieEventArgs.cs
- CachedBitmap.cs
- XNodeNavigator.cs
- AppSettingsExpressionEditor.cs
- ConfigurationValues.cs
- InboundActivityHelper.cs
- XmlFormatWriterGenerator.cs
- LinqDataSourceStatusEventArgs.cs
- SqlBooleanMismatchVisitor.cs
- PartialCachingAttribute.cs
- DataGridTableCollection.cs
- _ListenerRequestStream.cs
- EditorPart.cs
- EditingMode.cs
- QilBinary.cs
- LocatorBase.cs
- TextTreeObjectNode.cs
- JulianCalendar.cs
- MgmtConfigurationRecord.cs
- SqlProcedureAttribute.cs
- SoapCodeExporter.cs
- DataControlField.cs
- UserControlAutomationPeer.cs
- SamlAuthenticationClaimResource.cs
- DEREncoding.cs
- WhitespaceReader.cs
- BamlResourceContent.cs
- RegexMatchCollection.cs
- ItemsPanelTemplate.cs
- SessionStateUtil.cs
- DataServiceQuery.cs
- InternalsVisibleToAttribute.cs
- PersonalizationState.cs
- DbParameterCollectionHelper.cs
- EditorZoneBase.cs
- SafeHandles.cs
- IconConverter.cs
- PersonalizationStateQuery.cs
- HttpListenerTimeoutManager.cs
- SchemaSetCompiler.cs
- MetadataCache.cs
- EntityDataSourceChangingEventArgs.cs
- CodeSnippetStatement.cs
- GlyphingCache.cs
- PhysicalAddress.cs
- COSERVERINFO.cs
- EmissiveMaterial.cs
- DetailsViewUpdateEventArgs.cs
- EmptyElement.cs
- SqlProfileProvider.cs
- Validator.cs
- ListChangedEventArgs.cs
- TemplateKeyConverter.cs
- TextEditorCopyPaste.cs
- PostBackOptions.cs
- ComponentDispatcher.cs
- embossbitmapeffect.cs
- Utils.cs
- FixedSOMPageConstructor.cs
- ColorEditor.cs
- BCLDebug.cs
- FtpCachePolicyElement.cs
- ReferenceConverter.cs
- DrawingAttributesDefaultValueFactory.cs
- ToolboxItemAttribute.cs
- COM2ComponentEditor.cs
- SchemaImporter.cs
- XmlImplementation.cs
- CompilationPass2Task.cs
- OperationValidationEventArgs.cs
- SoapEnvelopeProcessingElement.cs
- DataListItem.cs
- SecurityPermission.cs
- URLIdentityPermission.cs
- InternalResources.cs
- UnsafeNetInfoNativeMethods.cs
- PerformanceCounterCategory.cs
- DeliveryRequirementsAttribute.cs
- DataPagerFieldCommandEventArgs.cs
- PeerNameRecord.cs
- _Win32.cs
- NamedElement.cs
- Completion.cs
- PersonalizableTypeEntry.cs
- Debug.cs
- Environment.cs