azure - 对 Azure 中的 Websocket 限制、事件连接进行故障排除

标签 azure websocket asp.net-core azure-web-app-service

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

问题是,大约 20 小时后,我收到 503 条回复,表示我已达到 Websocket 限制。

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

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

在我的应用程序或 Azure 门户中,是否可以在任何地方查看事件 Websocket 连接的数量?

跟进:

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

重新启动应用服务并将一个客户端配置为无限期地重新连接后。

一切正常,直到“websocket 连接总数”达到 350。此时我关闭了客户端。

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

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

更新2

与此同时,我一直在与 Microsoft 开发人员支持联系,他们注意到似乎套接字卡在 IIS 中,而不是卡在 Kestrel 中。原因仍在调查中。

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

我会更新这个问题,以防我的代码中出现错误。

最佳答案

我建议你定义一个变量来计算连接数。如果打开了 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;
            }
        }
    }
}

关于azure - 对 Azure 中的 Websocket 限制、事件连接进行故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44870506/

相关文章:

azure - 有没有办法像网站一样向公众共享 Azure VM 上的文件夹?

apache - 如何使用 Apache 反向代理动态端口?

c# - 为什么 StreamReader.ReadToEnd 有效但 Stream.Read 无效?

java - WebSockets 不适用于 OpenShift Tomcat 7.0 和 WildFly Application Server 8.1.0.CR1

azure - 使用 Azure B2C 保护 BLOB 存储中的 Assets

asp.net-core - 在 Serilog 中动态设置电子邮件主题

c# - 使用 Azure AD 的用户管理器

c#-4.0 - Gzip 并上传到 Azure blob

azure - 使用视频索引器和媒体服务检测 PII 并进行编辑

node.js - 如何从websocket客户端请求中获取参数