Bot框架获取embedded式聊天控制页面的ServiceUrl

我想将聊天控件embedded到许多网站,我想要获取我已经embedded的网站的Url,以便我的机器人可以获得与网站URL匹配的数据。 但是,当我embedded由WebChat生成的iframe时,我总是得到相同的ServiceUrl,这是https://webchat.botframework.com/ ,它不是网站的Url,所以我怎么能将聊天控件embedded到任何网站和我的机器人可以得到的网站Url不WebChat或DirectLine的url。

以下是我尝试过的: 直线聊天控制

以下是我用已发布的bottesting的结果: 结果

我注意到,当我用Bot Framework模拟器testing了我的机器人时,它总是返回发送者的确切Url(在本地testingm的情况下,它将返回http:// localhost:XXXX / )。 那我们怎么能这样呢?

我认为实现这个目标的方法是使用BackChannel,它增加了一个bot与一个通过WebChatembeddedbot的页面进行通信的能力。 它会允许你:

  • 将事件发送到承载WebChat实例的页面
  • 从托pipeWebChat实例的页面收听事件

第一部分当然是HTML页面,它将包含你放在一起的内容,以及发送/收听事件的逻辑。 具有基本逻辑的示例页面可以在这里find,下面是带有事件相关代码的图像。

BackChannel事件

现在,你需要准备你的机器人来收听和发送事件。 Node.js有一个示例 ,显示了如何做到这一点。

将它移植到C# ,就像监听和发送Eventtypes的活动一样简单。 一个示例代码(使用前面提到的HTML页面的事件):

 public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { if (activity.Type == ActivityTypes.Event && string.Equals(activity.Name, "buttonClicked", StringComparison.InvariantCultureIgnoreCase)) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // return our reply to the user Activity reply = activity.CreateReply("I see that you just pushed that button"); await connector.Conversations.ReplyToActivityAsync(reply); } if (activity.Type == ActivityTypes.Message) { ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); // return our reply to the user var reply = activity.CreateReply(); reply.Type = ActivityTypes.Event; reply.Name = "changeBackground"; reply.Value = activity.Text; await connector.Conversations.ReplyToActivityAsync(reply); } else { HandleSystemMessage(activity); } var response = Request.CreateResponse(HttpStatusCode.OK); return response; } 

底线,在您的HTML页面,你将不得不发送一个事件到机器人,页面的URL和机器人将不得不听取该事件,以获得值