public void Reconnect(
TcpMessageSocket socket,
uint requestId,
uint sequenceNumber,
X509Certificate2 clientCertificate,
TcpChannelToken token,
OpenSecureChannelRequest request)
{
if (socket == null) throw new ArgumentNullException("socket");
lock (DataLock)
{
// make sure the same client certificate is being used.
CompareCertificates(ClientCertificate, clientCertificate, false);
// check for replay attacks.
if (!VerifySequenceNumber(sequenceNumber, "Reconnect"))
{
throw new ServiceResultException(StatusCodes.BadSequenceNumberInvalid);
}
try
{
// replace the socket.
Socket = socket;
Utils.Trace("TCPSERVERCHANNEL SOCKET RECONNECTED: {0:X8}, ChannelId={1}", Socket.Handle, ChannelId);
Socket.ChangeSink(this);
// need to assign a new token id.
token.TokenId = GetNewTokenId();
// put channel back in open state.
ActivateToken(token);
State = TcpChannelState.Open;
// no need to cleanup.
if (m_cleanupTimer != null)
{
m_cleanupTimer.Dispose();
m_cleanupTimer = null;
}
// send response.
SendOpenSecureChannelResponse(requestId, token, request);
// send any queue responses.
ThreadPool.QueueUserWorkItem(new WaitCallback(OnChannelReconnected), m_queuedResponses);
m_queuedResponses = new SortedDictionary<uint,IServiceResponse>();
}
catch (Exception e)
{
SendServiceFault(token, requestId, ServiceResult.Create(e, StatusCodes.BadTcpInternalError, "Unexpected error processing request."));
}
}
}