[英]Chain 2 websockets in .NET (using asp.net 4.5)
我想在服務器端打開一個GET方法,該方法將簡單地向另一個Web服務器打開一個websocket,並充當客戶端和另一個服務器之間的簡單網關。
在客戶端和第一個Web服務器之間獲得WebSocket非常簡單,但是我找不到如何輕松打開另一個Web容器並轉發消息的方法。 請注意,我什至不需要收聽客戶端當前正在推送的內容:所有消息都來自第二個Web服務器。
我設法寫了下面的代碼,似乎還可以。 由於我在這里提出了問題,因此我發布了代碼。 任何評論將不勝感激。
[Route("api/{slip}")]
[HttpGet]
public async Task<IHttpActionResult> TrackJob(String slip)
{
var serverEndpoint = string.Format("ws://{0}/api/services", slip);
HttpContext currentContext = HttpContext.Current;
if (currentContext.IsWebSocketRequest)
{
try
{
currentContext.AcceptWebSocketRequest(GetWebSocketSession(serverEndpoint));
return ResponseMessage(Request.CreateResponse(HttpStatusCode.SwitchingProtocols));
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw ex;
}
}
else
{
return NotFound();
}
}
private Func<AspNetWebSocketContext, Task> GetWebSocketSession(String serverEndpoint)
{
Func<AspNetWebSocketContext, Task> func = async (context) =>
{
var wsToClient = context.WebSocket;
using (var wsToProcessingCluster = new ClientWebSocket())
{
new Task(async () =>
{
var inputSegment = new ArraySegment<byte>(new byte[1024]);
while (true)
{
// MUST read if we want the state to get updated...
try
{
await wsToClient.ReceiveAsync(inputSegment, CancellationToken.None);
}
catch (Exception ex)
{
Console.WriteLine(ex);
return;
}
if (wsToClient.State != WebSocketState.Open)
{
await wsToProcessingCluster.CloseAsync(WebSocketCloseStatus.Empty, "", CancellationToken.None);
break;
}
}
}).Start();
var buffer = new byte[1024];
var uri = new Uri(serverEndpoint);
await wsToProcessingCluster.ConnectAsync(uri, CancellationToken.None);
while (true)
{
if (wsToClient.State != WebSocketState.Open)
{
break;
}
else
{
var segment = new ArraySegment<byte>(buffer);
var result = await wsToProcessingCluster.ReceiveAsync(segment, CancellationToken.None);
await wsToClient.SendAsync(segment, result.MessageType, result.EndOfMessage, CancellationToken.None);
}
}
}
};
return func;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.