Мой клиент веб-сокета должен отправить большое сообщение, содержащее изображение в кодировке base64.Сейчас это довольно медленно, и я подумал ... ну, может быть, мне следует увеличить ReceiveBufferSize моего сервера веб-сокетов в ASP.NET Core 2.0.
К сожалению ... похоже, он полностью игнорирует моиустановить размер буфера ...
Прочитав документацию, это единственный способ установить ReceiveBufferSize, который я обнаружил:
WebSocketOptions webSocketOptions = new WebSocketOptions()
{
ReceiveBufferSize = 8192
};
app.UseWebSockets(webSocketOptions);
Соединение начинается с использованием ApiController, передающего HttpContext в«Служба», содержащая этот метод:
public async Task Register(string hub, HttpContext httpContext)
{
if (httpContext.WebSockets.IsWebSocketRequest)
{
WebSocket webSocket = await httpContext.WebSockets.AcceptWebSocketAsync();
await _websocketServer.StartJoinHubWithId(webSocket, "hub", hub);
}
}
И затем передача его в класс WebsocketHandler, который находится в отдельной письменной библиотеке, содержащей этот метод Готовьтесь к некоторому отбеливанию глаз :
private async Task ReadHandler(WebSocket socket, string hub, string clientId)
{
byte[] buffer = new byte[8192];
try
{
int mode = 0;
string partialReceived = "";
while (socket.State == WebSocketState.Open)
{
_isrunning = true;
WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
_isrunning = false;
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
}
else
{
if (result.EndOfMessage)
{
if (result.MessageType == 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
if (message.Length > 0)
{
if (message.Contains("PARTIAL-DATA,START"))
{
mode = 1;
}
else if (message.Contains("PARTIAL-DATA,END"))
{
OnWebsocketMessageReceived(partialReceived, hub, clientId);
partialReceived = "";
mode = 0;
}
switch (mode)
{
case 0:
if (!message.Contains("PARTIAL-DATA"))
{
OnWebsocketMessageReceived(message, hub, clientId);
}
break;
case 1:
if (message.Contains("PARTIAL-DATA,"))
{
if (!message.Contains("PARTIAL-DATA,START") &&
!message.Contains("PARTIAL-DATA,END"))
{
partialReceived = partialReceived + message.Substring(13);
}
}
else
{
Debug.WriteLine(
"ERROR, PARTIAL DATA DID NOT START WITH PREFIX: PARTIAL-DATA, OR HAS START OR END IN ITS PREFIX");
mode = 0;
}
break;
}
}
}
Array.Clear(buffer, 0, buffer.Length);
}
}
}
await Stop(hub, clientId);
}
catch (WebSocketException e)
{
Debug.WriteLine("Websocket client closed without calling abort.");
Debug.WriteLine(e.ToString());
await Stop(hub, clientId);
}
}
В конце концов, это приводит к следующему:
И из предыдущих испытаний я могу сказать, что только частьСтрока отправки получена.
Это говорит мне о том, что он все еще использует буфер по умолчанию 4 КБИ я понятия не имею, как решить эту проблему.