e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
110 lines
3.5 KiB
C#
110 lines
3.5 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.Diagnostics;
|
|
using System.Runtime.Diagnostics;
|
|
using System.ServiceModel;
|
|
using System.ServiceModel.Diagnostics;
|
|
|
|
abstract class OutputChannel : ChannelBase, IOutputChannel
|
|
{
|
|
protected OutputChannel(ChannelManagerBase manager)
|
|
: base(manager)
|
|
{
|
|
}
|
|
|
|
public abstract EndpointAddress RemoteAddress { get; }
|
|
public abstract Uri Via { get; }
|
|
|
|
public IAsyncResult BeginSend(Message message, AsyncCallback callback, object state)
|
|
{
|
|
return this.BeginSend(message, this.DefaultSendTimeout, callback, state);
|
|
}
|
|
|
|
public IAsyncResult BeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state)
|
|
{
|
|
if (message == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
|
|
|
|
if (timeout < TimeSpan.Zero)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
|
new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
|
|
|
|
ThrowIfDisposedOrNotOpen();
|
|
AddHeadersTo(message);
|
|
this.EmitTrace(message);
|
|
return OnBeginSend(message, timeout, callback, state);
|
|
}
|
|
|
|
public void EndSend(IAsyncResult result)
|
|
{
|
|
OnEndSend(result);
|
|
}
|
|
|
|
public override T GetProperty<T>()
|
|
{
|
|
if (typeof(T) == typeof(IOutputChannel))
|
|
{
|
|
return (T)(object)this;
|
|
}
|
|
|
|
T baseProperty = base.GetProperty<T>();
|
|
if (baseProperty != null)
|
|
{
|
|
return baseProperty;
|
|
}
|
|
|
|
return default(T);
|
|
}
|
|
|
|
protected abstract void OnSend(Message message, TimeSpan timeout);
|
|
|
|
protected abstract IAsyncResult OnBeginSend(Message message, TimeSpan timeout, AsyncCallback callback, object state);
|
|
|
|
protected abstract void OnEndSend(IAsyncResult result);
|
|
|
|
public void Send(Message message)
|
|
{
|
|
this.Send(message, this.DefaultSendTimeout);
|
|
}
|
|
|
|
public void Send(Message message, TimeSpan timeout)
|
|
{
|
|
if (message == null)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
|
|
|
|
if (timeout < TimeSpan.Zero)
|
|
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
|
|
new ArgumentOutOfRangeException("timeout", timeout, SR.GetString(SR.SFxTimeoutOutOfRange0)));
|
|
|
|
ThrowIfDisposedOrNotOpen();
|
|
|
|
AddHeadersTo(message);
|
|
this.EmitTrace(message);
|
|
OnSend(message, timeout);
|
|
}
|
|
|
|
protected virtual TraceRecord CreateSendTrace(Message message)
|
|
{
|
|
return MessageTransmitTraceRecord.CreateSendTraceRecord(message, this.RemoteAddress);
|
|
}
|
|
|
|
void EmitTrace(Message message)
|
|
{
|
|
if (DiagnosticUtility.ShouldTraceInformation)
|
|
{
|
|
TraceUtility.TraceEvent(TraceEventType.Information, TraceCode.MessageSent,
|
|
SR.GetString(SR.TraceCodeMessageSent),
|
|
this.CreateSendTrace(message), this, null);
|
|
}
|
|
}
|
|
|
|
protected virtual void AddHeadersTo(Message message)
|
|
{
|
|
}
|
|
}
|
|
}
|