在ASP.NET中嵌入Skype聊天控件后用DirectLineClient监控消息遇编译错误
先给你提个容易混淆的点:你嵌入的Skype聊天控件是通过Skype通道和机器人交互的,而DirectLineClient是Bot Framework里用来让客户端应用和机器人通过DirectLine通道通信的工具,它并不是用来监控机器人从其他通道(比如Skype)收到的消息的。如果你的目标是在ASP.NET后台处理用户通过Skype控件发的消息,更合适的方式是用Bot Framework SDK来构建机器人服务,而不是直接用DirectLineClient。
不过先回到你遇到的编译错误,通常这类问题逃不开下面几个原因,你可以逐一排查:
1. 没装DirectLine的NuGet包
编译报错最常见的原因就是缺依赖包。你得先安装Microsoft.Bot.Connector.DirectLine:
- 用Package Manager控制台的话,跑这个命令:
Install-Package Microsoft.Bot.Connector.DirectLine -Version 3.0.0 - 要是用.NET CLI,就执行:
dotnet add package Microsoft.Bot.Connector.DirectLine --version 3.0.0
版本号可以根据你的.NET版本选稳定版就行。
2. 漏加必要的命名空间
在后台代码文件顶部加上这两个命名空间,不然编译器找不到DirectLine的相关类:
using Microsoft.Bot.Connector.DirectLine; using System.Threading.Tasks; // 因为DirectLine的大部分方法都是异步的
3. DirectLineClient初始化不对
旧版本的构造函数可能已经弃用了,现在初始化得用你的DirectLine密钥(这个密钥要从Azure Bot Service的DirectLine通道设置里拿,不是你Skype控件里的data-bot-id):
var directLineSecret = "你的DirectLine密钥"; var client = new DirectLineClient(directLineSecret);
如果用令牌认证的话,写法是这样:
var directLineToken = "你的DirectLine令牌"; var client = new DirectLineClient(new Uri("https://directline.botframework.com/"), directLineToken);
4. 异步方法调用没处理好
DirectLine的API基本都是异步的,要是你在同步方法里调用异步方法却没加await,肯定会编译报错。比如获取会话消息的正确写法应该是这样:
public async Task MonitorDirectLineMessagesAsync(string conversationId) { var directLineSecret = "你的DirectLine密钥"; var client = new DirectLineClient(directLineSecret); var activities = await client.Conversations.GetActivitiesAsync(conversationId); foreach (var activity in activities.Activities) { // 过滤掉机器人自己发的消息,只处理用户的 if (activity.From.Id != "你的机器人ID") { // 这里写你处理用户消息的逻辑 Console.WriteLine($"用户消息: {activity.Text}"); } } }
这里要注意:你得确保
conversationId是有效的DirectLine会话ID,但Skype控件的会话ID和DirectLine的会话ID是不通用的,这也是为啥用DirectLineClient监控Skype消息行不通的原因之一。
正确监控Skype通道消息的姿势
如果你的目标是接收用户通过Skype控件发的消息,应该用Bot Framework SDK来构建机器人服务:
- 先创建一个继承自
ActivityHandler的机器人类,用来处理消息:
public class MyBot : ActivityHandler { protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // 这里就能拿到用户发的消息,不管是从Skype还是其他通道来的 var userMessage = turnContext.Activity.Text; // 示例:给用户回个消息 await turnContext.SendActivityAsync(MessageFactory.Text($"你刚才发了: {userMessage}"), cancellationToken); } }
- 然后在你的ASP.NET项目里配置Bot服务,再去Azure Bot Service里把Skype通道加上,这样用户通过Skype控件发的消息就会自动传到你的ASP.NET后台的机器人端点了。
内容的提问来源于stack exchange,提问作者user977606

