e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
217 lines
6.8 KiB
C#
217 lines
6.8 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Channels
|
|
{
|
|
using System.Runtime;
|
|
using System.Runtime.Diagnostics;
|
|
using System.ServiceModel.Diagnostics;
|
|
using System.Threading;
|
|
using System.ServiceModel.Diagnostics.Application;
|
|
|
|
class TracingConnection : DelegatingConnection
|
|
{
|
|
ServiceModelActivity activity;
|
|
|
|
static WaitCallback callback;
|
|
|
|
public TracingConnection(IConnection connection, ServiceModelActivity activity)
|
|
: base(connection)
|
|
{
|
|
this.activity = activity;
|
|
}
|
|
|
|
public TracingConnection(IConnection connection, bool inheritCurrentActivity)
|
|
: base(connection)
|
|
{
|
|
this.activity = inheritCurrentActivity ?
|
|
ServiceModelActivity.CreateActivity(DiagnosticTraceBase.ActivityId, false) :
|
|
ServiceModelActivity.CreateActivity();
|
|
Fx.Assert(this.activity != null, "");
|
|
if (DiagnosticUtility.ShouldUseActivity && !inheritCurrentActivity)
|
|
{
|
|
if (null != FxTrace.Trace)
|
|
{
|
|
FxTrace.Trace.TraceTransfer(this.activity.Id);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void Abort()
|
|
{
|
|
try
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
base.Abort();
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
if (this.activity != null)
|
|
{
|
|
this.activity.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
static WaitCallback Callback
|
|
{
|
|
get
|
|
{
|
|
if (TracingConnection.callback == null)
|
|
{
|
|
TracingConnection.callback = new WaitCallback(TracingConnection.WaitCallback);
|
|
}
|
|
return TracingConnection.callback;
|
|
}
|
|
}
|
|
|
|
public override void Close(TimeSpan timeout, bool asyncAndLinger)
|
|
{
|
|
try
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity, true))
|
|
{
|
|
base.Close(timeout, asyncAndLinger);
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
if (this.activity != null)
|
|
{
|
|
this.activity.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void Shutdown(TimeSpan timeout)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity, true))
|
|
{
|
|
base.Shutdown(timeout);
|
|
}
|
|
}
|
|
|
|
internal void ActivityStart(string name)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
ServiceModelActivity.Start(this.activity, SR.GetString(SR.ActivityReceiveBytes, name), ActivityType.ReceiveBytes);
|
|
}
|
|
}
|
|
|
|
internal void ActivityStart(Uri uri)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
ServiceModelActivity.Start(this.activity, SR.GetString(SR.ActivityReceiveBytes, uri.ToString()), ActivityType.ReceiveBytes);
|
|
}
|
|
}
|
|
|
|
public override AsyncCompletionResult BeginWrite(byte[] buffer, int offset, int size, bool immediate, TimeSpan timeout, WaitCallback callback, object state)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
return base.BeginWrite(buffer, offset, size, immediate, timeout, callback, state);
|
|
}
|
|
}
|
|
|
|
public override void EndWrite()
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
base.EndWrite();
|
|
}
|
|
}
|
|
|
|
public override void Write(byte[] buffer, int offset, int size, bool immediate, TimeSpan timeout)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
base.Write(buffer, offset, size, immediate, timeout);
|
|
}
|
|
}
|
|
|
|
public override void Write(byte[] buffer, int offset, int size, bool immediate, TimeSpan timeout, BufferManager bufferManager)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
base.Write(buffer, offset, size, immediate, timeout, bufferManager);
|
|
}
|
|
}
|
|
|
|
public override int Read(byte[] buffer, int offset, int size, TimeSpan timeout)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
return base.Read(buffer, offset, size, timeout);
|
|
}
|
|
}
|
|
|
|
static void WaitCallback(object state)
|
|
{
|
|
TracingConnectionState tracingData = (TracingConnectionState)state;
|
|
tracingData.ExecuteCallback();
|
|
}
|
|
|
|
public override AsyncCompletionResult BeginRead(int offset, int size, TimeSpan timeout, System.Threading.WaitCallback callback, object state)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
TracingConnectionState completion = new TracingConnectionState(callback, this.activity, state);
|
|
return base.BeginRead(offset, size, timeout, TracingConnection.Callback, completion);
|
|
}
|
|
}
|
|
|
|
public override int EndRead()
|
|
{
|
|
int retval = 0;
|
|
try
|
|
{
|
|
if (this.activity != null)
|
|
{
|
|
ExceptionUtility.UseActivityId(this.activity.Id);
|
|
}
|
|
retval = base.EndRead();
|
|
}
|
|
finally
|
|
{
|
|
ExceptionUtility.ClearActivityId();
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
public override object DuplicateAndClose(int targetProcessId)
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity, true))
|
|
{
|
|
return base.DuplicateAndClose(targetProcessId);
|
|
}
|
|
}
|
|
|
|
class TracingConnectionState
|
|
{
|
|
object state;
|
|
WaitCallback callback;
|
|
ServiceModelActivity activity;
|
|
|
|
internal TracingConnectionState(WaitCallback callback, ServiceModelActivity activity, object state)
|
|
{
|
|
this.activity = activity;
|
|
this.callback = callback;
|
|
this.state = state;
|
|
}
|
|
|
|
internal void ExecuteCallback()
|
|
{
|
|
using (ServiceModelActivity.BoundOperation(this.activity))
|
|
{
|
|
this.callback(state);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|