在本地漫游器中工作正常,但在网络聊天频道上“向此漫游器发送此消息时出错: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
);
}
答案 0 :(得分:1)
您似乎想捕获ConversationUpdate
活动并创建并发送一条虚假消息以初始化对话框,以便通过PromptDialog.Choice()
方法提示一组选择之一。我建议您先指定活动的Text
属性,然后再将其发送给初始化对话框,然后可以通过检查对话框中的消息活动Text
属性来执行不同的操作。
根据您的情况,我创建了以下示例代码,这些示例代码对我来说适用于Web聊天,您可以参考它。
在MessagesController中:
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);
}
}
测试结果: