在将所有websocket数据发送到客户端之前,ASP.NET关闭连接
|
我写了一个简单的asp.net websocket处理程序作为远程数据处理服务器和客户端之间的网关.
以下是我的数据传输代码: internal class WebSocketStreamTransfer{
public WebSocketStreamTransfer(CancellationToken disconnectionToken){
DisconnectionToken = disconnectionToken;
}
private CancellationToken DisconnectionToken{
get;
set;
}
public async Task AcceptWebSocketConnection(WebSocketContext context) {
if (context == null)
throw new ArgumentNullException("context");
WebSocket websocket = context.WebSocket;
if (websocket == null)
throw new SocksOverHttpException("Null websocket");
using(IConnection conn = ConnectionManagerFactory.ConnectionManager.CreateConnection(Guid.NewGuid().ToString())) {
try {
DisconnectionToken.Register(conn.Close);
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(null);
await Task.WhenAny(SendDataToRemoteServer(conn,websocket,DisconnectionToken,tcs),SendDataToClient(conn,tcs.Task));
} catch(Exception e) {
Logger.LogException(e);
}
}
}
internal static async Task SendDataToRemoteServer(IConnection conn,WebSocket websocket,CancellationToken cancelToken,TaskCompletionSource<bool> tcs) {
try {
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[ApplicationConfiguration.GetDefaultBufferSize()]);
while (IsConnected(conn,cancelToken,websocket)) {
WebSocketReceiveResult result = await websocket.ReceiveAsync(buffer,cancelToken);
if (websocket.State == WebSocketState.Open) {
if (result.MessageType == WebSocketMessageType.Binary) {
if (result.Count > 0) {
if (IsConnected(conn,websocket)) {
int numRead = await conn.SendData(buffer.Array,result.Count,cancelToken);
if (numRead > 0) {
tcs.TrySetResult(true); // Notify SendDataToClient can continue
}else{
Logger.LogError("Client not send enough data for remote connection built");
return;
}
} else {
Logger.LogInformation("SendDataToRemoteServer: Cancel send data to remote server due to connection closed");
}
} else
Logger.LogInformation("Receive empty binary message");
} else if (result.MessageType == WebSocketMessageType.Text) {
Logger.LogError("Receive unexpected text message");
return;
} else {
Logger.LogInformation("Receive close message");
await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure,"Close Connection",cancelToken);
return;
}
} else {
Logger.LogInformation("SendDataToRemoteServer: WebSocket connection closed by client");
return;
}
}
}finally{
tcs.TrySetResult(true);
}
}
internal static async Task SendDataToClient(IConnection conn,Task connectedTask) {
await connectedTask;
while (IsConnected(conn,websocket)) {
byte[] data = await conn.ReceiveData(cancelToken);
if (data.Length <= 0) {
Logger.LogInformation("SendDataToClient: Get empty data from remote server");
return;
}
if (IsConnected(conn,websocket)) {
await websocket.SendAsync(new ArraySegment<byte>(data),WebSocketMessageType.Binary,true,cancelToken);
} else {
Logger.LogInformation("SendDataToClient: Cancel send data to client due to connection closed");
}
}
}
internal static bool IsConnected(IConnection conn,WebSocket websocket) {
bool socketConnected = websocket.State == WebSocketState.Open;
return socketConnected && conn.Connected && !cancelToken.IsCancellationRequested;
}
}
问题场景: > SendDataToRemoteServer等待客户端数据,客户端尚未发送数据 解决方法WebSocket消息可以分成不同的帧.您没有检查消息是否已完成.从与其他WS连接发送信息的代码应如下所示:WebSocketReceiveResult result = null;
do
{
result = await source.ReceiveAsync(buffer,CancellationToken.None);
var sendBuffer = new ArraySegment<Byte>(buffer.Array,buffer.Offset,result.Count);
await target.SendAsync(sendBuffer,result.MessageType,result.EndOfMessage,CancellationToken.None);
}
while (!result.EndOfMessage);
您必须检查EndOfMessage属性,并在消息未完成时继续读取. 它适用于您的本地计算机,因为本地您不会以相同的方式受到缓冲的影响,或者因为您尝试的消息较小. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – ASP .Net Web API下载图像为二进制
- asp.net-mvc – ASP.NET MVC如何指定View页面驻留在哪个文件
- asp.net-mvc – 如何创建特定于区域,控制器和操作的自定义A
- asp.net – 通过javascript禁止文本框中的退格
- asp.net-mvc – 不一致的可访问性:DbContext中的属性类型
- asp.net – 让另一个程序员接管现有项目
- asp.net-mvc – 用ASP.NET MVC实现MEF?
- asp.net – 如何在WebGrid中的列标题使用DisplayName数据注
- asp.net-mvc – Kendo:处理Ajax数据请求中的错误
- asp.net – 无法加载viewstate.正在加载viewstate的控制树必
- ASP.NET Hang – 通用字典并发问题导致GC死锁
- asp.net-mvc – ASP.NET MVC和Visual Studio 201
- asp.net-mvc – ASP.NET MVC 3 Beta 1 Block访问
- asp.net-web-api – Web API / MVC 6中的安全JSO
- 重命名控制器asp.net mvc
- 十七点学完安全知识超级详细了解进程和病毒知识
- asp.net-mvc – 如何为登录表单的链接指定返回UR
- asp.net-web-api – 无法识别Web Api [可查询]属
- asp.net-mvc-3 – MVC中的SSO(单点登录)
- rest – 基于权限从WebApi端点进行上下文序列化
