机器人框架 DirectLineClient.Conversations.PostActivityAsync returns 空
Botframework DirectLineClient.Conversations.PostActivityAsync returns null
我正在尝试通过 DirectLineClient 库向我的机器人发送 activity:
var directLineClient = new DirectLineClient($"{secret}");
directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");
var conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);
var activity = new Microsoft.Bot.Connector.DirectLine.Activity();
activity.From = new Microsoft.Bot.Connector.DirectLine.ChannelAccount();
activity.From.Name = "Morgan";
activity.Text = message;
activity.Type = "message";
var resourceResponse = await directLineClient.Conversations.PostActivityAsync(conversation.ConversationId, activity).ConfigureAwait(false);
await ReadBotMessagesAsync(directLineClient, conversation.ConversationId);
resourceResponse 始终为空。
在 Nicolas R 回答后编辑
我添加了一个等待机器人响应的方法:
private static async Task ReadBotMessagesAsync(DirectLineClient client, string conversationId)
{
string watermark = null;
while (true)
{
var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
watermark = activitySet?.Watermark;
foreach (Microsoft.Bot.Connector.DirectLine.Activity activity in activitySet.Activities)
{
Console.WriteLine(activity.Text);
if (activity.Attachments != null)
{
foreach (Microsoft.Bot.Connector.DirectLine.Attachment attachment in activity.Attachments)
{
Console.WriteLine(attachment.ContentType);
}
}
}
if (activitySet.Activities.Count > 0)
{
return;
}
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
}
}
但我始终无法摆脱 ReadBotMessagesAsync。
我确切地说我可以通过 HTTP 请求与我的机器人通信(使用 Postman 测试),并且它应该在发送消息时发送响应消息。
根据 OP 精度编辑
方法总是 returns null
基于 documentation/samples,看起来 PostActivityAsync
return 从未使用过,因此值可能不相关。
来自示例:
await client.Conversations.PostActivityAsync(conversation.ConversationId, userMessage);
参见示例 here。
想知道更多细节的朋友,因为这个答案仅限于与示例使用的比较,很遗憾这个包没有开源:https://github.com/Microsoft/BotBuilder/issues/2756
备注(对于那些会使用错误包的人)
我不建议使用位于此处的 DirectLineClient
Nuget 包:
https://www.nuget.org/packages/DirectLineClient 因为它自 2016 年 5 月以来就不再维护,并且 Bot Framework 从那时起发生了很大变化。
此外,它使用的是 DirectLine API 1.0,这在当时并不是最佳实践。请参阅文档 here:
Important
This article introduces key concepts in Direct Line API 1.1 and
provides information about relevant developer resources. If you are
creating a new connection between your client application and bot, use
Direct Line API 3.0 instead.
我正在尝试通过 DirectLineClient 库向我的机器人发送 activity:
var directLineClient = new DirectLineClient($"{secret}");
directLineClient.BaseUri = new Uri($"https://directline.botframework.com/");
var conversation = await directLineClient.Conversations.StartConversationAsync().ConfigureAwait(false);
var activity = new Microsoft.Bot.Connector.DirectLine.Activity();
activity.From = new Microsoft.Bot.Connector.DirectLine.ChannelAccount();
activity.From.Name = "Morgan";
activity.Text = message;
activity.Type = "message";
var resourceResponse = await directLineClient.Conversations.PostActivityAsync(conversation.ConversationId, activity).ConfigureAwait(false);
await ReadBotMessagesAsync(directLineClient, conversation.ConversationId);
resourceResponse 始终为空。
在 Nicolas R 回答后编辑
我添加了一个等待机器人响应的方法:
private static async Task ReadBotMessagesAsync(DirectLineClient client, string conversationId)
{
string watermark = null;
while (true)
{
var activitySet = await client.Conversations.GetActivitiesAsync(conversationId, watermark);
watermark = activitySet?.Watermark;
foreach (Microsoft.Bot.Connector.DirectLine.Activity activity in activitySet.Activities)
{
Console.WriteLine(activity.Text);
if (activity.Attachments != null)
{
foreach (Microsoft.Bot.Connector.DirectLine.Attachment attachment in activity.Attachments)
{
Console.WriteLine(attachment.ContentType);
}
}
}
if (activitySet.Activities.Count > 0)
{
return;
}
await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
}
}
但我始终无法摆脱 ReadBotMessagesAsync。
我确切地说我可以通过 HTTP 请求与我的机器人通信(使用 Postman 测试),并且它应该在发送消息时发送响应消息。
根据 OP 精度编辑
方法总是 returns null
基于 documentation/samples,看起来 PostActivityAsync
return 从未使用过,因此值可能不相关。
来自示例:
await client.Conversations.PostActivityAsync(conversation.ConversationId, userMessage);
参见示例 here。
想知道更多细节的朋友,因为这个答案仅限于与示例使用的比较,很遗憾这个包没有开源:https://github.com/Microsoft/BotBuilder/issues/2756
备注(对于那些会使用错误包的人)
我不建议使用位于此处的 DirectLineClient
Nuget 包:
https://www.nuget.org/packages/DirectLineClient 因为它自 2016 年 5 月以来就不再维护,并且 Bot Framework 从那时起发生了很大变化。
此外,它使用的是 DirectLine API 1.0,这在当时并不是最佳实践。请参阅文档 here:
Important
This article introduces key concepts in Direct Line API 1.1 and provides information about relevant developer resources. If you are creating a new connection between your client application and bot, use Direct Line API 3.0 instead.