簡體   English   中英

.NET中的Chain 2 websocket(使用asp.net 4.5)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM