如何在MS Bot SDK的C#代码中获取机器人托管页面URL?
获取托管Web Chat的页面URL(MS Bot SDK C#)
我刚好碰到过类似的需求,其实Bot Framework默认确实不会把托管页面的URL自动传到Activity对象里,但我们可以通过前端传自定义数据+后端解析ChannelData的方式解决,具体步骤如下:
第一步:前端Web Chat注入时传递页面URL
在你注入Web Chat的前端脚本里,添加自定义的channelData字段,把当前页面的URL(window.location.href)传递给Bot。示例代码如下:
window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ token: '你的Direct Line令牌' }), userID: '自定义用户ID', // 新增channelData,携带页面URL channelData: { pageUrl: window.location.href } }, document.getElementById('webchat'));
第二步:C#后端从Activity中解析URL
在Bot的消息处理逻辑里,通过Activity.ChannelData属性获取前端传递的自定义数据。因为ChannelData是动态类型,你可以用dynamic直接访问,或者用JObject解析(类型更安全)。示例代码:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { if (turnContext.Activity.ChannelData != null) { // 方式1:用dynamic直接访问 dynamic channelData = turnContext.Activity.ChannelData; string pageUrl = channelData.pageUrl; // 方式2:用JObject解析(类型更安全) // var channelData = JObject.FromObject(turnContext.Activity.ChannelData); // string pageUrl = channelData["pageUrl"]?.ToString(); if (!string.IsNullOrEmpty(pageUrl)) { // 拿到URL后做你需要的处理 await turnContext.SendActivityAsync(MessageFactory.Text($"托管页面的URL是:{pageUrl}"), cancellationToken); } else { await turnContext.SendActivityAsync(MessageFactory.Text("未获取到托管页面的URL"), cancellationToken); } } else { await turnContext.SendActivityAsync(MessageFactory.Text("未接收到自定义渠道数据"), cancellationToken); } }
补充说明
为什么Activity里没有默认的页面URL属性?因为Bot Framework的Activity模型是通用的,要适配Teams、Slack、Web Chat等多种渠道,不同渠道的上下文信息差异很大,Web Chat本身不会主动把页面URL传递给Bot,所以需要我们手动通过channelData自定义传递。
内容的提问来源于stack exchange,提问作者Calvin1103
相关产品推荐
相关产品推荐

