Я использую websocket в ядре .net, и моя проблема в том, что, когда клиент больше не подключен к Интернету, его соединение websocket закрывается, но на сервере клиент все еще подключен, я не получаю никакого пакета разъединения, вКроме того, я публикую веб-сокет в Azure, и я установил свойство WebSocket = ON и AlwaysOn = On.Пожалуйста, вы можете мне помочь!
У меня есть сервер ниже:
public async Task Invoke(HttpContext context)
{
if (context.WebSockets.IsWebSocketRequest)
{
SocketUserObject socketUser = new SocketUserObject();
if (_webSocketLogic.IsAuthorizedUser(context, ref socketUser, _operation))
{
var connection = await _webSocketHandler.OnConnected(context, socketUser, _operation);
if (connection != null)
{
await _webSocketHandler.ListenConnection(connection);
}
else
{
context.Response.StatusCode = 404;
}
}
else
{
context.Response.StatusCode = 404;
}
}
}
public async Task ListenConnection(WebSocketConnection connection)
{
var buffer = new byte[BufferSize];
try
{
while (connection.WebSocket.State == WebSocketState.Open)
{
var result = await connection.WebSocket.ReceiveAsync(
buffer: new ArraySegment<byte>(buffer),
cancellationToken: CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
await ReceiveAsync(connection, message, _operation2);
}
else if (result.MessageType == WebSocketMessageType.Close)
{
await OnDisconnected(connection, _operation2);
}
}
}
catch (Exception ex)
{
_logging.TraceError(ex, _operation);
}
_logging.TraceLog(System.Reflection.MethodInfo.GetCurrentMethod(), _operation, "after State ", connection.WebSocket.State.ToString());
}
И я добавил в запуске ниже:
var webSocketOptions = new WebSocketOptions()
{
KeepAliveInterval = TimeSpan.FromSeconds(1),
ReceiveBufferSize = 4 * 1024
};
app.UseWebSockets(webSocketOptions);
Я также попытался добавитьэто файл web.config, созданный в Azure из консоли Kudu:
<system.webServer>
<webSocket enabled="true" receiveBufferLimit="4194304" pingInterval="00:01:00">
</webSocket>
</system.webServer>
, и это мой клиент:
public void StartReceiving(int modulo)
{
RunWebSockets().GetAwaiter().GetResult();
}
private async Task RunWebSockets()
{
var client = new ClientWebSocket();
try
{
client.Options.SetRequestHeader("id_handset", "1");
await client.ConnectAsync(new Uri(url), CancellationToken.None);
Console.WriteLine("Connected!");
var sending = Task.Run(async () =>
{
string line;
if (client.State == WebSocketState.Open)
{
SocketOperation.Start(_socketOperation, client);
}
});
var receiving = Receiving(client);
await Task.WhenAll(sending, receiving);
}
catch (Exception ex)
{
if (client.State == WebSocketState.Open)
{
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
}
SocketOperation.StopConsole();
RunWebSockets().GetAwaiter().GetResult();
}
}
private async Task Receiving(ClientWebSocket client)
{
var buffer = new byte[1024 * 4];
while (true)
{
var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, result.Count));
else if (result.MessageType == WebSocketMessageType.Close)
{
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
SocketOperation.StopConsole();
RunWebSockets().GetAwaiter().GetResult();
//await client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
break;
}
}
}