我正在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>
如果我在同一窗口内使用聊天,这些方法会很好用,我的意思是我可以发送实时聊天消息并接收它,但是我无法从漫游器端向实时聊天发送消息
答案 0 :(得分:0)
好的,如果我正确理解了您的设置,则它们是两个不同的Web应用程序。这意味着SignalR集线器实例在每个正在运行的应用程序中将是唯一的。这意味着门户网站应用程序将托管您的实际客户端正在连接的“真实”集线器实例,但是,然后在您的bot应用程序中,您尝试在其中使用集线器上下文,而这些实例将是它们自己的实例,它们具有没有客户与他们联系。
最简单的选择是将Bot托管在门户应用程序本身中。这将确保它正在访问作为门户的确切集线器实例。这种方法的缺点是您会使应用程序承担多重责任(例如,现在您正在门户应用程序中运行机器人)。
下一个选择是以门户网站应用程序中的控制器的形式提供额外的“后端” REST API,该API专门用于允许bot触发您需要知道的事件,并且可以对其进行特别保护。只有像机器人这样的客户端才能调用它(例如,使用共享密钥)。
第三个选择是让您的机器人成为由门户网站本身托管的实际SignalR应用程序的 client 。这样一来,您就可以使用单一协议和通讯机制(相对于引入控制器),并且该机器人还会专门对其进行身份验证,以便它可以触发基本用户无法在集线器中发生的事件。