209 lines
6.2 KiB
C#
209 lines
6.2 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.ServiceModel;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Runtime.Serialization;
|
|
using System.Text;
|
|
using System.Threading;
|
|
|
|
abstract class TransportChannelFactory<TChannel> : ChannelFactoryBase<TChannel>, ITransportFactorySettings
|
|
{
|
|
BufferManager bufferManager;
|
|
long maxBufferPoolSize;
|
|
long maxReceivedMessageSize;
|
|
MessageEncoderFactory messageEncoderFactory;
|
|
bool manualAddressing;
|
|
MessageVersion messageVersion;
|
|
|
|
protected TransportChannelFactory(TransportBindingElement bindingElement, BindingContext context)
|
|
: this(bindingElement, context, TransportDefaults.GetDefaultMessageEncoderFactory())
|
|
{
|
|
}
|
|
|
|
protected TransportChannelFactory(TransportBindingElement bindingElement, BindingContext context,
|
|
MessageEncoderFactory defaultMessageEncoderFactory)
|
|
: base(context.Binding)
|
|
{
|
|
this.manualAddressing = bindingElement.ManualAddressing;
|
|
this.maxBufferPoolSize = bindingElement.MaxBufferPoolSize;
|
|
this.maxReceivedMessageSize = bindingElement.MaxReceivedMessageSize;
|
|
|
|
Collection<MessageEncodingBindingElement> messageEncoderBindingElements
|
|
= context.BindingParameters.FindAll<MessageEncodingBindingElement>();
|
|
|
|
if (messageEncoderBindingElements.Count > 1)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.MultipleMebesInParameters)));
|
|
}
|
|
else if (messageEncoderBindingElements.Count == 1)
|
|
{
|
|
this.messageEncoderFactory = messageEncoderBindingElements[0].CreateMessageEncoderFactory();
|
|
context.BindingParameters.Remove<MessageEncodingBindingElement>();
|
|
}
|
|
else
|
|
{
|
|
this.messageEncoderFactory = defaultMessageEncoderFactory;
|
|
}
|
|
|
|
if (null != this.messageEncoderFactory)
|
|
this.messageVersion = this.messageEncoderFactory.MessageVersion;
|
|
else
|
|
this.messageVersion = MessageVersion.None;
|
|
}
|
|
|
|
public BufferManager BufferManager
|
|
{
|
|
get
|
|
{
|
|
return this.bufferManager;
|
|
}
|
|
}
|
|
|
|
public long MaxBufferPoolSize
|
|
{
|
|
get
|
|
{
|
|
return this.maxBufferPoolSize;
|
|
}
|
|
}
|
|
|
|
public long MaxReceivedMessageSize
|
|
{
|
|
get
|
|
{
|
|
return maxReceivedMessageSize;
|
|
}
|
|
}
|
|
|
|
public MessageEncoderFactory MessageEncoderFactory
|
|
{
|
|
get
|
|
{
|
|
return this.messageEncoderFactory;
|
|
}
|
|
}
|
|
|
|
public MessageVersion MessageVersion
|
|
{
|
|
get
|
|
{
|
|
return this.messageVersion;
|
|
}
|
|
}
|
|
|
|
public bool ManualAddressing
|
|
{
|
|
get
|
|
{
|
|
return this.manualAddressing;
|
|
}
|
|
}
|
|
|
|
public abstract string Scheme { get; }
|
|
|
|
public override T GetProperty<T>()
|
|
{
|
|
if (typeof(T) == typeof(MessageVersion))
|
|
{
|
|
return (T)(object)this.MessageVersion;
|
|
}
|
|
|
|
if (typeof(T) == typeof(FaultConverter))
|
|
{
|
|
if (null == this.MessageEncoderFactory)
|
|
return null;
|
|
else
|
|
return this.MessageEncoderFactory.Encoder.GetProperty<T>();
|
|
}
|
|
|
|
if (typeof(T) == typeof(ITransportFactorySettings))
|
|
{
|
|
return (T)(object)this;
|
|
}
|
|
|
|
return base.GetProperty<T>();
|
|
}
|
|
|
|
|
|
protected override void OnAbort()
|
|
{
|
|
OnCloseOrAbort();
|
|
base.OnAbort();
|
|
}
|
|
|
|
protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state)
|
|
{
|
|
OnCloseOrAbort();
|
|
return base.OnBeginClose(timeout, callback, state);
|
|
}
|
|
|
|
protected override void OnClose(TimeSpan timeout)
|
|
{
|
|
OnCloseOrAbort();
|
|
base.OnClose(timeout);
|
|
}
|
|
|
|
void OnCloseOrAbort()
|
|
{
|
|
if (this.bufferManager != null)
|
|
{
|
|
this.bufferManager.Clear();
|
|
}
|
|
}
|
|
|
|
internal virtual int GetMaxBufferSize()
|
|
{
|
|
if (MaxReceivedMessageSize > int.MaxValue)
|
|
return int.MaxValue;
|
|
else
|
|
return (int)MaxReceivedMessageSize;
|
|
}
|
|
|
|
protected override void OnOpening()
|
|
{
|
|
base.OnOpening();
|
|
this.bufferManager = BufferManager.CreateBufferManager(MaxBufferPoolSize, GetMaxBufferSize());
|
|
}
|
|
|
|
internal void ValidateScheme(Uri via)
|
|
{
|
|
if (via.Scheme != this.Scheme)
|
|
{
|
|
// URI schemes are case-insensitive, so try a case insensitive compare now
|
|
if (string.Compare(via.Scheme, this.Scheme, StringComparison.OrdinalIgnoreCase) != 0)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("via", SR.GetString(SR.InvalidUriScheme,
|
|
via.Scheme, this.Scheme));
|
|
}
|
|
}
|
|
}
|
|
|
|
long ITransportFactorySettings.MaxReceivedMessageSize
|
|
{
|
|
get { return MaxReceivedMessageSize; }
|
|
}
|
|
|
|
BufferManager ITransportFactorySettings.BufferManager
|
|
{
|
|
get { return BufferManager; }
|
|
}
|
|
|
|
bool ITransportFactorySettings.ManualAddressing
|
|
{
|
|
get { return ManualAddressing; }
|
|
}
|
|
|
|
MessageEncoderFactory ITransportFactorySettings.MessageEncoderFactory
|
|
{
|
|
get { return MessageEncoderFactory; }
|
|
}
|
|
}
|
|
}
|