如何通过websocket将事件触发数据发送到客户端

时间:2018-04-05 11:47:51

标签: events asp.net-core websocket

几天前,我遇到了一些我似乎无法解决的问题。这就是我将其发布在StackOverflow上的原因。

我正在运行可以在后台运行任务的.NET CORE网站。这样的任务有3个事件(OnCompleted,OnStarted,TaskProgress)。我需要的是,如果这些事件中的任何一个触发,他将向连接的客户端发送数据。为简单起见,我想返回"事件被触发"字符串。

我目前所做的是以下内容:

  • app.UseWebSockets()添加到我的startup.cs文件
  • 在管道中添加了一个新函数来捕获websocket调用

    app.Use(async (context, next) =>
    {
        if (context.Request.Path == "/socket")
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await context.WebSockets.AcceptWebSocketAsync();
                //HERE IS MY PROBLEM
            }
            else
            {
                context.Response.StatusCode = 400;
            }
        }
        else
        {
            await next();
        }
    });
    
  • 我创建了一个SocketListener类,在触发时接收所有3个事件。

    private void _taskManager_TaskExecuting(object sender, GenericEventArgs<IScheduledTaskWorker> e)
    {
        SendData();
    }
    
    private void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
    {
        SendData();
    }
    
    private void Argument_TaskProgress(object sender, GenericEventArgs<double> e)
    {
        SendData();
    }
    

所以我现在需要的是在管道功能(//这里是我的问题行)中,我不知何故等待无限时间触发任何事件。如果它们触发,SocketListener类需要知道连接并通过WebSocket连接发回数据。

`SendData()&#39;函数将需要检查打开的连接并发送&#34;事件被触发&#34;字符串给所有人。

导航离开页面时也需要关闭连接。我想我可以使用一些有角度的NavigationStart事件来管理它,然后用一个关闭的消息调用socket api。

我在互联网上搜索了一个很好的解决方案,但大多数博文/教程/ ...都在谈论双向沟通(聊天程序,...)

任何人都知道如何解决这个问题?如果需要更多信息,请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

Helo Reggi,

我已经开源了一个我在.NET Core中构建的WebSocket应用程序。

我已将其构建为处理通用消息,而不仅仅是专注于聊天。

我的想法是在客户端(WebPage)和websocket中使用双向通信来执行任何类型的任务。

WebSocket通信与您在问题上的说法略有不同,但我编写的代码将是一个很好的指南。

您想要使用SendData做的事情就像我创建的控制器NotificationController上的'NotifyAllConnectedSockets'方法一样。

请看一下它是否适合你想要的东西。

BackEnd - https://github.com/asiilva/WSMessageHandler

前端 - https://github.com/asiilva/ws-message-handler-front

注意:这是一项前进和后端的工作。

随意提出任何问题

最好的问候