Azure 上 ASP.NET Web 套接字静态列表的不同实例

本文关键字:列表 实例 静态 套接字 ASP NET Web Azure | 更新日期: 2023-09-27 17:55:23

当我使用web套接字的静态列表时,有时对于不同的调用,静态字段的值是不同的。

它应该如何工作:

  • 当我使用 Web 套接字 (WebSocketHandler.ashx) 打开一些 HTML 页面时,从该页面发送的任何消息都会进入所有页面。
  • 当我调用 API 时,消息"来自 API 的你好"也会出现在所有页面。

它的实际工作方式(在 Azure 上):

  • 有时它工作正常
  • 但是有时来自第一页
  • 的消息只到第一页,而从第二页只到第二页,当我调用 API 时 - 变量是 WebSocketInit = false(这意味着 _webSockets = null)

那么我不能使用静态变量来存储 Web 套接字吗?那么在哪里保存套接字列表呢?或者我怎样才能做到静态字段始终具有相同的值?

WebSocketHandler.ashx:

private static List<WebSocket> _webSockets;
public void ProcessRequest(HttpContext context)
{
  if (context.IsWebSocketRequest)
    context.AcceptWebSocketRequest(WebSocketRequest);
}
private async Task WebSocketRequest(AspNetWebSocketContext context)
{
  var webSocket = context.WebSocket;
  _webSockets = new List<WebSocket>();
  _webSockets.Add(webSocket); // simplified by removing EnterWriteLock, ExitWriteLock
  try
  {
    while (true)
    {
      var arraySegment = new ArraySegment<byte>(new byte[1024]);
      var result = await _webSocket.ReceiveAsync(arraySegment, CancellationToken.None);
      SendToAll(result);
    }
  }
  catch { _webSockets.Remove(webSocket); }
}
public static bool SendToAll(ArraySegment<byte> arraySegment)
{
  if (_webSockets == null)
    return false;
  foreach (var webSocket in _webSockets.ToList()) // simplified
    try
    {
      if (webSocket.State == WebSocketState.Open)
        webSocket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None).Wait();
    }
    catch { _webSockets.Remove(webSocket); } // simplified
  return true;
}
public static bool SendToAll(string text)
{
    return Send(new ArraySegment<byte>(Encoding.UTF8.GetBytes(text)));
}

APIHandler.ashx:

var isWebSocketInit = WebSocketHandler.SendToAll("Hello from API");

Azure 上 ASP.NET Web 套接字静态列表的不同实例

我注意到在 Azure 门户的缩放设置中选择了 2 个实例。

选择1 Instance解决了问题。

manage.windowsazure.comWeb apps<My site>ScaleInstance Count1 Instance