在Bot框架中使用Signlar

时间:2019-01-20 20:15:06

标签: c# signalr botframework

我正在bot框架之上创建实时聊天,因此我将在同一解决方案(两个不同的项目)中托管一个管理门户和一个bot解决方案项目

我正在尝试将接收到的消息发送给漫游器到Signalr集线器,以便稍后将其发送到实时聊天窗口,但是该方法未被调用

这是我的代码:

 if (currentData.CurrentConversation != null && currentData.CurrentConversation.conversationchatmode == agentMode.conversationchatmodeid)
                        {  

                            var hubContext = GlobalHost.ConnectionManager.GetHubContext<ControlPanel.ChatHub>();
                            hubContext.Clients.All.broadcastMessage(message.Text);
                            var endResponse = Request.CreateResponse(HttpStatusCode.OK);
                            return endResponse;
                        }

这是JavaScript代码

    <script type="text/javascript">
    $(document).on('keypress', function (e) {
        if (e.which == 13) {
            e.preventDefault();
            $("#btnSend").click();
        }
    });
    $(function () {
        debugger;

        // Declare a proxy to reference the hub. 
        var chat = $.connection.chatHub;
        // Create a function that the hub can call to broadcast messages.
        chat.client.addMessage = function (name, message) {
            // Html encode display name and message. 
            //var encodedName = $('<div />').text(name).html();

        };

        chat.client.broadcastMessage = function (message) {
            debugger;
               var messageTobeAdded = "<div class='incoming_msg'>" +

                    "<div class='outgoing_msg'>" +
                    " <div class='sent_msg'> <p>" +


                    message +  

                    '</p>' +
                    "<span class='time_date'>" + new Date().toLocaleDateString() + " </span> " +
                    '</div>'
                    + '</div>'
                + '</div>';
                 $('#msgBox').append(messageTobeAdded);
        };
        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#btnSend').click(function (e) {
                debugger;
                var encodedMsg = $('#txtMessage').val();
                // Add the message to the page. 
                var messageTobeAdded = "<div class='incoming_msg'>" +

                    "<div class='outgoing_msg'>" +
                    " <div class='sent_msg'> <p>" +


                    encodedMsg +

                    '</p>' +
                    "<span class='time_date'>" + new Date().toLocaleDateString() + " </span> " +
                    '</div>'
                    + '</div>'
                    + '</div>';
                $('#msgBox').append(messageTobeAdded);
                // Call the Send method on the hub. 
                //Getting hidden field values
                debugger;
                var hfBotId = $("#" + '<%= hfBotId.ClientID %>').val();
                var hfBotName = $("#" + '<%= hfBotName.ClientID %>').val();
                var hfcustomerName = $("#" + '<%= hfcustomerName.ClientID %>').val();
                var hfcustomerrecepeintId = $("#" + '<%= hfcustomerrecepeintId.ClientID %>').val();
                chat.server.send(hfBotId , hfBotName , hfcustomerName , hfcustomerrecepeintId, encodedMsg);
                // Clear text box and reset focus for next comment. 
                $('#txtMessage').val('').focus();
                e.preventDefault();
                $('#msgBox').scrollTop($('#msgBox')[0].scrollHeight);
            });
        });
    });
</script>

如果我在同一窗口内使用聊天,这些方法会很好用,我的意思是我可以发送实时聊天消息并接收它,但是我无法从漫游器端向实时聊天发送消息

1 个答案:

答案 0 :(得分:0)

好的,如果我正确理解了您的设置,则它们是两个不同的Web应用程序。这意味着SignalR集线器实例在每个正在运行的应用程序中将是唯一的。这意味着门户网站应用程序将托管您的实际客户端正在连接的“真实”集线器实例,但是,然后在您的bot应用程序中,您尝试在其中使用集线器上下文,而这些实例将是它们自己的实例,它们具有没有客户与他们联系。

最简单的选择是将Bot托管在门户应用程序本身中。这将确保它正在访问作为门户的确切集线器实例。这种方法的缺点是您会使应用程序承担多重责任(例如,现在您正在门户应用程序中运行机器人)。

下一个选择是以门户网站应用程序中的控制器的形式提供额外的“后端” REST API,该API专门用于允许bot触发您需要知道的事件,并且可以对其进行特别保护。只有像机器人这样的客户端才能调用它(例如,使用共享密钥)。

第三个选择是让您的机器人成为由门户网站本身托管的实际SignalR应用程序的 client 。这样一来,您就可以使用单一协议和通讯机制(相对于引入控制器),并且该机器人还会专门对其进行身份验证,以便它可以触发基本用户无法在集线器中发生的事件。