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

Jus*_*Van 4 .net c# botframework direct-line-botframework

我想将聊天控件嵌入到许多网站中,我想获取我嵌入的网站的Url,以便我的机器人可以获得与网站URL匹配的数据.但是,当我嵌入从WebChat生成的iframe时,我总是得到相同的ServiceUrl,那就是https://webchat.botframework.com/,它不是网站的Url,所以如何将聊天控件嵌入到任何网站中网站和我的机器人可以获取网站Url而不是WebChat或DirectLine的网址.

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

这是我用我发布的机器人测试的结果: 结果

我注意到,当我使用Bot框架模拟器测试我的僵尸程序时,它总是返回发件人的确切URL(如果是本地测试,它将返回http:// localhost:XXXX /).那我们怎么能这样做呢?

Eze*_*dib 7

我认为实现这一目标的一种方法是使用BackChannel,它增加了机器人与通过WebChat嵌入机器人的页面进行通信的能力.它将允许您:

  • 将事件发送到承载WebChat实例的页面
  • 从承载WebChat实例的页面中侦听事件

第一部分当然是HTML页面,它将包含您放在一起的内容,以及发送/收听事件的逻辑.可以在此处找到具有基本逻辑的示例页面,下面是具有事件相关代码的图像.

BackChannel事件

现在,您需要准备机器人来监听和发送事件.有一个样品Node.js,显示了如何做到这一点.

将其移植到C#,就像收听和发送到Event类型的活动一样简单.该示例代码(使用前面提到的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;
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,在您的HTML页面中,您必须向机器人发送事件,页面URL和机器人必须收听该事件才能获得价值