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

Posted

技术标签:

【中文标题】Azure 上 ASP.NET 中 Web 套接字静态列表的不同实例【英文标题】:Different instances of the static list of web sockets in ASP.NET on Azure 【发布时间】:2016-07-07 00:20:48 【问题描述】:

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

它应该如何工作:

当我使用 Web 套接字 (WebSocketHandler.ashx) 打开一些 html 页面时,从该页面发送的任何消息都会到达所有页面。 当我调用 API 时,“Hello from API”的消息也会出现在所有页面中。

实际工作原理(在 Azure 上):

有时效果很好 但有时来自第一页的消息只出现在第一个页面,而来自第二个页面的消息只出现在第二个页面,当我调用 API 时 - 变量 isWebSocketInit = false(这意味着 _webSockets = null)

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

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");

【问题讨论】:

【参考方案1】:

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

选择1 Instance 解决了这个问题。

manage.windowsazure.comWeb apps&lt;My site&gt;ScaleInstance Count1 Instance

【讨论】:

以上是关于Azure 上 ASP.NET 中 Web 套接字静态列表的不同实例的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure 中托管的 ASP.NET Core 5.0 MVC 站点调用 API/服务的间歇性套接字异常

在 Chrome 中托管在 Azure 中的 ASP.NET Core Web 应用程序上的异常 HTTP 响应

为啥 Azure Web 角色上的 IIS 需要如此频繁地重新编译 ASP.NET 应用程序?

在 Azure 上部署 Asp.NET Core Web App

在 Asp.Net Core Web 应用程序中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal

Azure 云服务上的 Asp.Net Core MVC?