对Azure中的websocket限制进行故障排除,活动连接

时间:2017-07-02 11:51:18

标签: azure websocket asp.net-core azure-web-sites

我正在对使用websockets的App Service进行故障排除。 它运行在服务计划Basic上,允许350个websockets。 这是该计划中唯一使用websockets的应用程序。

问题是,在20个小时之后,我得到503个回复,说我达到了我的websocket限制。

现在设置有3个客户端连接到服务。

在调查我的应用中的websocket泄漏的过程中,我想跟踪正在使用的websockets的数量。

是否有任何地方,从我的应用程序或Azure门户网站,我可以看到活动的websocket连接数?

跟进:

我已将websocket连接记录为Amor suggested。 我的应用程序的HTTP部分仍在工作,我可以从应用程序获得动态结果,该应用程序现在报告哪些websocket连接处于活动状态以及自启动以来已创建了多少个。

重新启动应用服务并配置一个客户端以无限制地重新连接。

在“总websocket连接数”达到350之前,它工作正常。此时我关闭了客户端。

限制应该是350个并发连接,但看起来它自启动以来总共350个。 大多数(至少340个)这些连接是由一个客户端发起的,它在开始一个新连接之前处理每个连接,一旦达到限制就关闭了。

我被建议从Basic升级到Standard,因为标准没有人为限制。我能看到这项工作的唯一原因是,如果基本计划的websocket限制中存在错误。

更新2

与此同时,我一直与Microsoft Developer Support联系,他们注意到出现是因为套接字卡在IIS中而不是在Kestrel中。其原因仍在调查中。

支持可以显示连接使用情况随时间变化的图表,清楚地显示了如何达到限制。

如果我的代码中出现错误,我会更新此问题。

1 个答案:

答案 0 :(得分:1)

我建议您定义一个变量来计算连接数。如果打开Web套接字连接,只需增加连接数。如果关闭Web套接字连接,请减少连接数。以下代码供您参考。

计算ASP.NET SignalR的连接。

public class MyHub : Hub
{
    private int _connectionCount = 0;

    public override Task OnConnected()
    {
        _connectionCount++;
        return base.OnConnected();
    }

    public override Task OnReconnected()
    {
        _connectionCount++;
        return base.OnReconnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        _connectionCount--;
        return base.OnDisconnected(stopCalled);
    }
}

计算传统ASP.NET中的连接。

public class WSChatController : ApiController
{
    private int _connectionCount = 0;

    public HttpResponseMessage Get()
    {
        if (HttpContext.Current.IsWebSocketRequest)
        {
            HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat);
        }
        return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
    }

    private async Task ProcessWSChat(AspNetWebSocketContext context)
    {
        WebSocket socket = context.WebSocket;
        while (true)
        {
            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
            WebSocketReceiveResult result = await socket.ReceiveAsync(
                buffer, CancellationToken.None);
            if (socket.State == WebSocketState.Open)
            {
                _connectionCount++;
                //Process the request
            }
            else
            {
                _connectionCount--;
                break;
            }
        }
    }
}