e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
178 lines
6.2 KiB
C#
178 lines
6.2 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.ServiceModel.Activation;
|
|
using System.Collections.Generic;
|
|
using System.Net.Security;
|
|
using System.Runtime.Serialization;
|
|
using System.ServiceModel.Security;
|
|
|
|
using System.Xml;
|
|
|
|
public sealed class MsmqTransportBindingElement : MsmqBindingElementBase
|
|
{
|
|
int maxPoolSize = MsmqDefaults.MaxPoolSize;
|
|
bool useActiveDirectory = MsmqDefaults.UseActiveDirectory;
|
|
QueueTransferProtocol queueTransferProtocol = MsmqDefaults.QueueTransferProtocol;
|
|
|
|
public MsmqTransportBindingElement() { }
|
|
|
|
MsmqTransportBindingElement(MsmqTransportBindingElement elementToBeCloned)
|
|
: base(elementToBeCloned)
|
|
{
|
|
this.useActiveDirectory = elementToBeCloned.useActiveDirectory;
|
|
this.maxPoolSize = elementToBeCloned.maxPoolSize;
|
|
this.queueTransferProtocol = elementToBeCloned.queueTransferProtocol;
|
|
}
|
|
|
|
internal override MsmqUri.IAddressTranslator AddressTranslator
|
|
{
|
|
get
|
|
{
|
|
switch (this.queueTransferProtocol)
|
|
{
|
|
case QueueTransferProtocol.Srmp:
|
|
return MsmqUri.SrmpAddressTranslator;
|
|
case QueueTransferProtocol.SrmpSecure:
|
|
return MsmqUri.SrmpsAddressTranslator;
|
|
default:
|
|
return this.useActiveDirectory ? MsmqUri.ActiveDirectoryAddressTranslator : MsmqUri.NetMsmqAddressTranslator;
|
|
}
|
|
}
|
|
}
|
|
|
|
public int MaxPoolSize
|
|
{
|
|
get
|
|
{
|
|
return this.maxPoolSize;
|
|
}
|
|
set
|
|
{
|
|
if (value < 0)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
|
new ArgumentOutOfRangeException("value", value, SR.GetString(SR.MsmqNonNegativeArgumentExpected)));
|
|
}
|
|
this.maxPoolSize = value;
|
|
}
|
|
}
|
|
|
|
public QueueTransferProtocol QueueTransferProtocol
|
|
{
|
|
get
|
|
{
|
|
return this.queueTransferProtocol;
|
|
}
|
|
set
|
|
{
|
|
if (!QueueTransferProtocolHelper.IsDefined(value))
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("value"));
|
|
this.queueTransferProtocol = value;
|
|
}
|
|
}
|
|
|
|
public override string Scheme
|
|
{
|
|
get
|
|
{
|
|
return "net.msmq";
|
|
}
|
|
}
|
|
|
|
public bool UseActiveDirectory
|
|
{
|
|
get
|
|
{
|
|
return this.useActiveDirectory;
|
|
}
|
|
set
|
|
{
|
|
this.useActiveDirectory = value;
|
|
}
|
|
}
|
|
|
|
internal override string WsdlTransportUri
|
|
{
|
|
get
|
|
{
|
|
return TransportPolicyConstants.MsmqTransportUri;
|
|
}
|
|
}
|
|
|
|
public override BindingElement Clone()
|
|
{
|
|
return new MsmqTransportBindingElement(this);
|
|
}
|
|
|
|
public override bool CanBuildChannelFactory<TChannel>(BindingContext context)
|
|
{
|
|
return (typeof(TChannel) == typeof(IOutputChannel)
|
|
|| typeof(TChannel) == typeof(IOutputSessionChannel));
|
|
}
|
|
|
|
public override bool CanBuildChannelListener<TChannel>(BindingContext context)
|
|
{
|
|
return (typeof(TChannel) == typeof(IInputChannel)
|
|
|| typeof(TChannel) == typeof(IInputSessionChannel));
|
|
}
|
|
|
|
public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
|
|
{
|
|
if (context == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
|
|
}
|
|
|
|
if (typeof(TChannel) == typeof(IOutputChannel))
|
|
{
|
|
MsmqChannelFactoryBase<IOutputChannel> factory = new MsmqOutputChannelFactory(this, context);
|
|
MsmqVerifier.VerifySender<IOutputChannel>(factory);
|
|
return (IChannelFactory<TChannel>)(object)factory;
|
|
}
|
|
else if (typeof(TChannel) == typeof(IOutputSessionChannel))
|
|
{
|
|
MsmqChannelFactoryBase<IOutputSessionChannel> factory = new MsmqOutputSessionChannelFactory(this, context);
|
|
MsmqVerifier.VerifySender<IOutputSessionChannel>(factory);
|
|
return (IChannelFactory<TChannel>)(object)factory;
|
|
}
|
|
else
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("TChannel", SR.GetString(SR.ChannelTypeNotSupported, typeof(TChannel)));
|
|
}
|
|
}
|
|
|
|
public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
|
|
{
|
|
if (context == null)
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("context");
|
|
}
|
|
|
|
TransportChannelListener msmqListener;
|
|
|
|
MsmqTransportReceiveParameters receiveParameters = new MsmqTransportReceiveParameters(this, MsmqUri.NetMsmqAddressTranslator);
|
|
|
|
if (typeof(TChannel) == typeof(IInputChannel))
|
|
{
|
|
msmqListener = new MsmqInputChannelListener(this, context, receiveParameters);
|
|
}
|
|
else if (typeof(TChannel) == typeof(IInputSessionChannel))
|
|
{
|
|
msmqListener = new MsmqInputSessionChannelListener(this, context, receiveParameters);
|
|
}
|
|
else
|
|
{
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument("TChannel", SR.GetString(SR.ChannelTypeNotSupported, typeof(TChannel)));
|
|
}
|
|
AspNetEnvironment.Current.ApplyHostedContext(msmqListener, context);
|
|
|
|
MsmqVerifier.VerifyReceiver(receiveParameters, msmqListener.Uri);
|
|
|
|
return (IChannelListener<TChannel>)(object)msmqListener;
|
|
}
|
|
}
|
|
}
|