[英]Different instances of the static list of web sockets in ASP.NET on Azure
當我使用Web套接字的靜態列表時,有時對於不同的調用,靜態字段的值是不同的。
它應該如何工作:
實際工作方式(在Azure上):
那我不能使用靜態變量來存儲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.com
→ Web apps
→ <My site>
→ Scale
→ Instance Count
→ 1 Instance
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.