如何使用C#获取Web Chat客户端传递给Bot的Channel Data
在C#服务器端访问Web Chat发送的Channel Data
你在前端通过Web Chat的store给 outgoing activity 附加了myCustomProperty自定义属性,在C#后端的Bot里其实很容易拿到这个值,我给你两种常用的实现方式:
方式1:用dynamic类型快速访问
这种方式代码简洁,适合快速开发,但要注意如果属性名拼写错误会触发运行时异常:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { if (turnContext.Activity.ChannelData != null) { dynamic channelData = turnContext.Activity.ChannelData; string customValue = channelData.myCustomProperty; // 这里可以根据拿到的值做后续业务处理 await turnContext.SendActivityAsync(MessageFactory.Text($"我收到你的自定义属性啦:{customValue}"), cancellationToken); } else { await turnContext.SendActivityAsync(MessageFactory.Text("没收到自定义的Channel Data哦"), cancellationToken); } }
方式2:用JObject做强类型检查(更安全)
如果想避免拼写错误、需要更严谨的类型校验,推荐用Newtonsoft.Json的JObject来解析:
using Newtonsoft.Json.Linq; // ... protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { if (turnContext.Activity.ChannelData != null) { var channelDataObj = JObject.FromObject(turnContext.Activity.ChannelData); // 用?运算符避免空引用异常 string customValue = channelDataObj["myCustomProperty"]?.ToString(); if (!string.IsNullOrEmpty(customValue)) { await turnContext.SendActivityAsync(MessageFactory.Text($"自定义属性值是:{customValue}"), cancellationToken); } else { await turnContext.SendActivityAsync(MessageFactory.Text("没找到myCustomProperty这个属性"), cancellationToken); } } }
另外要重点注意你前端注释里提到的安全问题:Channel Data非常容易被伪造,所以一定要在后端验证数据的合法性,比如前端给自定义属性附加HMAC签名,后端拿到后重新计算签名并对比,确保数据来自合法客户端,绝对不能直接信任前端传过来的值。
内容的提问来源于stack exchange,提问作者xCander
相关产品推荐
相关产品推荐

