使用 Directline 在 WinForm 与我现有的 Azure Bot 集成中遇到问题 API
Facing Issues in WinForm Integration with my Existing Azure Bot Using Directline API
我使用 Bot Framework SDK(C#、.Net)创建了一个机器人。我已经在 Azure 中发布了它。它在 WebChat 和 Teams 频道中运行良好。现在我想创建一个 Winform 并尝试使用 Directline Api.
将 Winform UI 连接到我的机器人
这是我的代码:
public 部分 class Form1 : 表格
{
private static string directLineSecret = ConfigurationSettings.AppSettings["DirectLineSecret"];
private static string botId = ConfigurationSettings.AppSettings["BotId"];
private static string fromUser = "User";
private static string id = "default-user";
private Conversation conversation;
DirectLineClient directLineClient = null;
public Form1()
{
InitializeComponent();
InitClientAsync();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private async Task InitClientAsync()
{
directLineClient = new DirectLineClient($"{directLineSecret}");
directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");
//directLineClient = new DirectLineClient(directLineSecret);
conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);
new System.Threading.Thread(async () => await ReadBotMessageAsync(directLineClient, conversation.ConversationId)).Start();
}
private async Task ReadBotMessageAsync(DirectLineClient client, string conversationId)
{
string watermark = null;
while(true)
{
var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
watermark = activitySet?.Watermark;
var activities = from x in activitySet.Activities where x.From.Id == botId select x;
foreach(Activity activity in activities)
{
if(activity.Text != null)
{
string message = activity.Text;
if(InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate
{
textBox.AppendText("Bot : " + message + "\r\n");
}));
}
}
}
}
}
private async void btn_Send_Click(object sender, EventArgs e)
{
string input = txt_Send.Text;
txt_Send.Clear();
if(input.Length>0)
{
Activity userMessage = new Activity
{
From = new ChannelAccount(id, fromUser),
Text = input,
Type = ActivityTypes.Message,
TextFormat = "plain"
};
textBox.AppendText("You : " + input + "\r\n");
await directLineClient.Conversations.PostActivityAsync(this.conversation.ConversationId, userMessage);
}
}
}
但是当我执行程序时,它在尝试获取对话和对话 ID 时由于空引用异常而停止。
您可以在此处查看 error image。
任何人都可以告诉我我在这里缺少什么吗?
任何帮助将不胜感激.....
问题出在直线密钥上。我重新生成了一个新密钥并使用了它。现在开始对话,我可以看到对话 ID。
但之后我收到状态代码 429 错误。那基本上是多线程问题。它试图同时创建多个线程。
然后我使用 .Net Framework 4.6.2 版(以前使用 4.7)重新创建整个项目。现在那个问题也解决了。项目运行良好。
我使用 Bot Framework SDK(C#、.Net)创建了一个机器人。我已经在 Azure 中发布了它。它在 WebChat 和 Teams 频道中运行良好。现在我想创建一个 Winform 并尝试使用 Directline Api.
将 Winform UI 连接到我的机器人这是我的代码:
public 部分 class Form1 : 表格 {
private static string directLineSecret = ConfigurationSettings.AppSettings["DirectLineSecret"];
private static string botId = ConfigurationSettings.AppSettings["BotId"];
private static string fromUser = "User";
private static string id = "default-user";
private Conversation conversation;
DirectLineClient directLineClient = null;
public Form1()
{
InitializeComponent();
InitClientAsync();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private async Task InitClientAsync()
{
directLineClient = new DirectLineClient($"{directLineSecret}");
directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");
//directLineClient = new DirectLineClient(directLineSecret);
conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);
new System.Threading.Thread(async () => await ReadBotMessageAsync(directLineClient, conversation.ConversationId)).Start();
}
private async Task ReadBotMessageAsync(DirectLineClient client, string conversationId)
{
string watermark = null;
while(true)
{
var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
watermark = activitySet?.Watermark;
var activities = from x in activitySet.Activities where x.From.Id == botId select x;
foreach(Activity activity in activities)
{
if(activity.Text != null)
{
string message = activity.Text;
if(InvokeRequired)
{
BeginInvoke(new MethodInvoker(delegate
{
textBox.AppendText("Bot : " + message + "\r\n");
}));
}
}
}
}
}
private async void btn_Send_Click(object sender, EventArgs e)
{
string input = txt_Send.Text;
txt_Send.Clear();
if(input.Length>0)
{
Activity userMessage = new Activity
{
From = new ChannelAccount(id, fromUser),
Text = input,
Type = ActivityTypes.Message,
TextFormat = "plain"
};
textBox.AppendText("You : " + input + "\r\n");
await directLineClient.Conversations.PostActivityAsync(this.conversation.ConversationId, userMessage);
}
}
}
但是当我执行程序时,它在尝试获取对话和对话 ID 时由于空引用异常而停止。
您可以在此处查看 error image。
任何人都可以告诉我我在这里缺少什么吗? 任何帮助将不胜感激.....
问题出在直线密钥上。我重新生成了一个新密钥并使用了它。现在开始对话,我可以看到对话 ID。
但之后我收到状态代码 429 错误。那基本上是多线程问题。它试图同时创建多个线程。 然后我使用 .Net Framework 4.6.2 版(以前使用 4.7)重新创建整个项目。现在那个问题也解决了。项目运行良好。