簡體   English   中英

Azure上ASP.NET中Web套接字靜態列表的不同實例

[英]Different instances of the static list of web sockets in ASP.NET on Azure

當我使用Web套接字的靜態列表時,有時對於不同的調用,靜態字段的值是不同的。

它應該如何工作:

  • 當我使用Web套接字(WebSocketHandler.ashx)打開一些HTML頁面時,從該頁面發送的任何消息都會到達所有頁面。
  • 當我調用API時,消息“來自API的問候”也會出現在所有頁面上。

實際工作方式(在Azure上):

  • 有時效果很好
  • 但是有時候,來自第一頁的消息僅到達第一頁,來自第二頁的消息僅到達第二頁,並且當我調用API時-變量isWebSocketInit = 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門戶的縮放設置中選擇了2個實例

選擇1 Instance解決該問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM