c# - Microsoft bot 服务在本地工作得非常好,但在网络聊天频道中却不行
问题描述
在本地机器人中工作非常好,但在网络聊天频道“向您的机器人发送此消息时出错:HTTP 状态代码网关超时”错误发生但机器人在第二次响应后正确运行
控制器代码
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new EchoDialog());
}
else if (message.Type == ActivityTypes.ConversationUpdate)
{
// Handle conversation state changes, like members being added and removed
// Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
// Not available in all channels
IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;
if (iConversationUpdated != null)
{
ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));
foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
{
// if the bot is added, then
if (member.Id == iConversationUpdated.Recipient.Id)
{
var reply = ((Activity)iConversationUpdated).CreateReply("Hi, Welcome to Systenics.");
await connector.Conversations.ReplyToActivityAsync(reply);
await Conversation.SendAsync(message, () => new EchoDialog());
}
}
}
}
else
{
await HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
聊天对话框
public async Task StartAsync(IDialogContext context)
{
context.Wait(this.ShowOptions);
}
public virtual async Task ShowOptions(IDialogContext context, IAwaitable<IMessageActivity> activity)
{
var message = await activity;
var descriptions = new string[] { "Request a Quote", "More Information About Jobs" };
PromptDialog.Choice(
context: context,
resume: ChoiceReceivedAsync,
options: descriptions,
prompt: "Please select an option below:",
retry: "Selected option not available.",
promptStyle: PromptStyle.Auto
);
}
解决方案
您似乎想捕捉ConversationUpdate
活动并创建并发送假消息来初始化对话框,以便通过方法提示一组选择中的一个PromptDialog.Choice()
。我建议你可以Text
在发送之前指定activity的属性来初始化对话框,然后你可以通过查看Text
对话框中的消息activity属性来做不同的操作。
根据您的场景,我创建了以下示例代码,它适用于网络聊天,您可以参考它。
在消息控制器中:
else if (activity.Type == ActivityTypes.ConversationUpdate)
{
// Handle conversation state changes, like members being added and removed
// Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
// Not available in all channels
IConversationUpdateActivity iConversationUpdated = activity as IConversationUpdateActivity;
if (iConversationUpdated != null)
{
ConnectorClient connector = new ConnectorClient(new System.Uri(activity.ServiceUrl));
foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
{
// if the bot is added, then
if (member.Id == iConversationUpdated.Recipient.Id)
{
var reply = ((Activity)iConversationUpdated).CreateReply("Hi, Welcome to Systenics.");
await connector.Conversations.ReplyToActivityAsync(reply);
//set value to Text property
activity.Text = "show choices";
await Conversation.SendAsync(activity, () => new EchoDialog());
}
}
}
}
在对话框中:
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var activity = await result as Activity;
var mes = activity.Text?.ToString();
if (mes == "show choices")
{
var descriptions = new string[] { "Request a Quote", "More Information About Jobs" };
PromptDialog.Choice(
context: context,
resume: ChoiceReceivedAsync,
options: descriptions,
prompt: "Please select an option below:",
retry: "Selected option not available.",
promptStyle: PromptStyle.Auto
);
}
else
{
if (mes == "More Information About Jobs")
{
var replymes = context.MakeMessage();
replymes.Text = "Click on this link to know more about jobs [https//www.abc.com](https//www.abc.com)";
await context.PostAsync(replymes);
}
else if (mes == "Request a Quote")
{
//your code logic here
}
else
{
await context.PostAsync($"You sent {activity.Text}");
}
context.Wait(MessageReceivedAsync);
}
}
测试结果:
推荐阅读
- python - 我有两个数据框 DF1 和 DF2,在特定索引处将满足 DF2 条件的行追加到 DF1 的最佳方法是什么?
- javascript - 用 JavaScript 中的条件检查间隔
- javascript - 缺少数据时jquery数据表消失
- powershell - Renaming largest files that contain distinct sub strings of predetermined length in powershell
- wordpress - WP查询数组中的数组
- python - Clicking a non-clickable button waiting to upload the download to download Selenium python
- android - Firebase v1 HTTP api 不支持嵌套的 JSON 对象
- zapier - Zapier 未转义字符 zapier 代码中的错误
- javascript - 为什么我无法在画布上正确绘制
- tmux - 运行 tmux stop 命令时如何触发自定义命令或脚本?