我正在对使用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中。其原因仍在调查中。
支持可以显示连接使用情况随时间变化的图表,清楚地显示了如何达到限制。
如果我的代码中出现错误,我会更新此问题。
答案 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;
}
}
}
}