protected WebSocketBase(Stream innerStream,
string subProtocol,
TimeSpan keepAliveInterval,
WebSocketBuffer internalBuffer)
{
Debug.Assert(internalBuffer != null, "'internalBuffer' MUST NOT be NULL.");
WebSocketValidate.ValidateInnerStream(innerStream);
WebSocketValidate.ValidateOptions(subProtocol, internalBuffer.ReceiveBufferSize,
internalBuffer.SendBufferSize, keepAliveInterval);
string parameters = string.Empty;
if (NetEventSource.IsEnabled)
{
parameters = string.Format(CultureInfo.InvariantCulture,
"ReceiveBufferSize: {0}, SendBufferSize: {1}, Protocols: {2}, KeepAliveInterval: {3}, innerStream: {4}, internalBuffer: {5}",
internalBuffer.ReceiveBufferSize,
internalBuffer.SendBufferSize,
subProtocol,
keepAliveInterval,
NetEventSource.GetHashCode(innerStream),
NetEventSource.GetHashCode(internalBuffer));
NetEventSource.Enter(this, parameters);
}
_thisLock = new object();
try
{
_innerStream = innerStream;
_internalBuffer = internalBuffer;
if (NetEventSource.IsEnabled)
{
NetEventSource.Associate(this, _innerStream);
NetEventSource.Associate(this, _internalBuffer);
}
_closeOutstandingOperationHelper = new OutstandingOperationHelper();
_closeOutputOutstandingOperationHelper = new OutstandingOperationHelper();
_receiveOutstandingOperationHelper = new OutstandingOperationHelper();
_sendOutstandingOperationHelper = new OutstandingOperationHelper();
_state = WebSocketState.Open;
_subProtocol = subProtocol;
_sendFrameThrottle = new SemaphoreSlim(1, 1);
_closeStatus = null;
_closeStatusDescription = null;
_innerStreamAsWebSocketStream = innerStream as IWebSocketStream;
if (_innerStreamAsWebSocketStream != null)
{
_innerStreamAsWebSocketStream.SwitchToOpaqueMode(this);
}
_keepAliveTracker = KeepAliveTracker.Create(keepAliveInterval);
}
finally
{
if (NetEventSource.IsEnabled)
{
NetEventSource.Exit(this, parameters);
}
}
}