использование signlar с каркасом бота - PullRequest
0 голосов
/ 20 января 2019

Я создаю живой чат поверх моей платформы ботов, поэтому я размещаю административный портал и проекты с бот-решениями в одном решении (два разных проекта)

Я пытаюсь отправить полученное сообщение боту в концентратор сигналов, чтобы отправить его позже в окно живого чата, но метод не вызывается

вот мой код:

 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 голосов
/ 21 января 2019

Хорошо, если я правильно понимаю ваши настройки, это два разных веб-приложения. Это будет означать, что экземпляры концентратора SignalR будут полностью уникальными в каждом запущенном приложении. Это означает, что в приложении портала будут размещаться «настоящие» экземпляры-концентраторы, к которым подключаются ваши реальные клиенты, но затем в вашем бот-приложении вы пытаетесь использовать контекст концентратора, и это будут их собственные экземпляры, которые имеют к ним не привязаны клиенты.

Самый простой вариант - разместить бота в самом приложении портала. Это обеспечит доступ к точным экземплярам концентратора в качестве портала. Недостатком этого подхода является то, что вы перегружаете свое приложение множеством обязанностей (например, теперь вы запускаете бота в своем портальном приложении).

Следующим вариантом будет предоставление дополнительного «бэкэнда» REST API в виде контроллера в приложении портала, которое специально разработано для того, чтобы позволить боту запускать события, которые вам нужны, и которые могут быть защищены таким образом, чтобы что только клиенты, такие как бот, могут вызывать его (например, с помощью общего ключа).

Третий вариант - сделать вашего бота клиентом реального приложения SignalR, которое размещается на самом портале. Это позволит вам использовать единый протокол и механизм связи (против введения контроллера), и, опять же, бот будет просто аутентифицировать себя специально, чтобы он мог инициировать события в концентраторах, которые обычные пользователи не могут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...