public override Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken)
{
if (messageType != WebSocketMessageType.Text && messageType != WebSocketMessageType.Binary)
{
throw new ArgumentException(SR.Format(
SR.net_WebSockets_Argument_InvalidMessageType,
nameof(WebSocketMessageType.Close), nameof(SendAsync), nameof(WebSocketMessageType.Binary), nameof(WebSocketMessageType.Text), nameof(CloseOutputAsync)),
nameof(messageType));
}
WebSocketValidate.ValidateArraySegment(buffer, nameof(buffer));
try
{
ClientWebSocket.ThrowIfInvalidState(_state, _disposed, s_validSendStates);
ThrowIfOperationInProgress(_lastSendAsync);
}
catch (Exception exc)
{
return Task.FromException(exc);
}
MessageOpcode opcode =
_lastSendWasFragment ? MessageOpcode.Continuation :
messageType == WebSocketMessageType.Binary ? MessageOpcode.Binary :
MessageOpcode.Text;
Task t = SendFrameAsync(opcode, endOfMessage, buffer, cancellationToken);
_lastSendWasFragment = !endOfMessage;
_lastSendAsync = t;
return t;
}