0
Webソケットの静的リストを使用するとき、異なる呼び出しのために時々静的フィールドの値が異なります。AzureのASP.NETのWebソケットの静的リストの別のインスタンス
それがどのように動作するかを:
- 私は、Webソケット(WebSocketHandler.ashx)を使用して、いくつかのHTMLページを開くと、ページから送信されたメッセージはすべてのページに来ます。
- APIを呼び出すと、「Hello from API」というメッセージもすべてのページに表示されます。それは実際に(アズールに)どのように動作する
:
- 時にはそれが
- 正常に動作します。しかし、時には最初のページからのメッセージが最初のものだけに、2ページ目から来ているだけに来ます私は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");