WebSocketOptions игнорирует размер получаемого буфера - PullRequest
0 голосов
/ 07 июня 2018

Мой клиент веб-сокета должен отправить большое сообщение, содержащее изображение в кодировке 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);
    }
}

В конце концов, это приводит к следующему:

enter image description here

И из предыдущих испытаний я могу сказать, что только частьСтрока отправки получена.

Это говорит мне о том, что он все еще использует буфер по умолчанию 4 КБИ я понятия не имею, как решить эту проблему.

1 Ответ

0 голосов
/ 08 июня 2018

https://github.com/aspnet/Home/issues/3206 Проблема решена, это был я все время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...