File: System\ServiceModel\Activation\TcpWorkerProcess.cs
Project: ndp\cdf\src\WCF\SMSvcHost\SMSvcHost.csproj (SMSvcHost)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.ServiceModel.Activation
{
    using System;
    using System.Diagnostics;
    using System.Net.Sockets;
    using System.Runtime;
    using System.ServiceModel.Activation.Diagnostics;
 
    class TcpWorkerProcess : WorkerProcess
    {
        protected override DuplicateContext DuplicateConnection(ListenerSessionConnection session)
        {
            SocketInformation dupedSocket = default(SocketInformation);
            try
            {
                dupedSocket = (SocketInformation)session.Connection.DuplicateAndClose(this.ProcessId);
            }
#pragma warning suppress 56500 // covered by FxCOP
            catch (Exception exception)
            {
                if (Fx.IsFatal(exception))
                {
                    throw;
                }
 
                // this normally happens if:
                // A) we don't have rights to duplicate handles to the WorkerProcess NativeErrorCode == 10022
                // B) we fail to duplicate handle because the WorkerProcess is exiting/exited NativeErrorCode == 10024
                // - in the self hosted case: report error to the client
                // - in the web hosted case: roundrobin to the next available WorkerProcess (if this WorkerProcess is down?)
#if DEBUG
                if (exception is SocketException)
                {
                    Debug.Print("TcpWorkerProcess.DuplicateConnection() failed duplicating socket for processId: " + this.ProcessId + " errorCode:" + ((SocketException)exception).NativeErrorCode + " exception:" + exception.Message);
                }
#endif
                if (DiagnosticUtility.ShouldTraceError)
                {
                    ListenerTraceUtility.TraceEvent(TraceEventType.Error, ListenerTraceCode.MessageQueueDuplicatedSocketError, SR.GetString(SR.TraceCodeMessageQueueDuplicatedSocketError), this, exception);
                }
                if (TD.MessageQueueDuplicatedSocketErrorIsEnabled())
                {                    
                    TD.MessageQueueDuplicatedSocketError(session.EventTraceActivity);
                }
 
 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ServiceActivationException(SR.GetString(SR.MessageQueueDuplicatedSocketError), exception));
            }
 
            if (DiagnosticUtility.ShouldTraceInformation)
            {
                ListenerTraceUtility.TraceEvent(TraceEventType.Information, ListenerTraceCode.MessageQueueDuplicatedSocket, SR.GetString(SR.TraceCodeMessageQueueDuplicatedSocket), this);
            }
            if (TD.MessageQueueDuplicatedSocketCompleteIsEnabled())
            {
                TD.MessageQueueDuplicatedSocketComplete(session.EventTraceActivity);
            }
 
            return new TcpDuplicateContext(dupedSocket, session.Via, session.Data);
        }
 
        protected override void OnDispatchSuccess()
        {
            ListenerPerfCounters.IncrementConnectionsDispatchedTcp();
        }
 
        protected override TransportType TransportType
        {
            get
            {
                return TransportType.Tcp;
            }
        }
    }
}