【问题标题】:Using web sockets and events in MS Bot Framework在 MS Bot Framework 中使用 Web 套接字和事件
【发布时间】:2017-01-14 15:50:53
【问题描述】:

我正在尝试使用我的机器人中的 Web 套接字与服务器上的 echo 服务进行通信。我正在使用 WebSocketSharp 程序集创建 Web 套接字连接。我想回显机器人中的任何用户类型,但它从不触发“ws.OnMessage”事件,我没有回复。我在控制台应用程序上测试了连接,一切正常。请建议我在这里做错了什么。

下面是我的 MessageController

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, () => new HumanCollaboratorDialog());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

下面是我的 HumanCollaboratorDialog 类

[Serializable]
public class HumanCollaboratorDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(this.MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;

        using (var ws = new WebSocket("ws://Some IP addrress:8080/human-collaborator/echo"))
        {

            ws.OnMessage += async (sender, e) =>
            {
                try
                {
                    await context.PostAsync(e.Data);
                }
                catch (Exception ex)
                {
                    await context.PostAsync($"Exception: {ex.Message}");
                }
            };

            ws.ConnectAsync();
            var msg = message.Text;
            ws.Send(msg);

        }

        context.Wait(this.MessageReceivedAsync);
    }
}

【问题讨论】:

    标签: c# events websocket botframework websocket-sharp


    【解决方案1】:

    “MessageReceivedAsync”不是创建 websocket 的正确位置。 bot 框架中的 WebSockets 用于在 Direct Line 连接场景中接收消息。通过调用StartConversationAsync 获得的StreamUrl 用于创建Web 套接字:

    var token = await new DirectLineClient(dlSecret).Tokens.GenerateTokenForNewConversationAsync();
    
    // Use token to create conversation
    var directLineClient = new DirectLineClient(tokenResponse.Token);
    var conversation = await directLineClient.Conversations.StartConversationAsync();
    
    using (var webSocketClient = new WebSocket(conversation.StreamUrl))
    {
        webSocketClient.OnMessage += WebSocketClient_OnMessage;
        webSocketClient.Connect();
    

    等等

    请看这里:https://github.com/Microsoft/BotBuilder-Samples/blob/master/CSharp/core-DirectLineWebSockets/DirectLineClient/Program.cs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-28
      • 2019-06-04
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多