我注意到,使用PromptDialog.Choice()
主動開始對話並不像預期的那樣工作,並想知道我是否做錯了什麼或者它是否是bot框架中的問題。PromptDialog.Choice()的消息處理不正確?
我使用的提示在我的根對話是這樣的:
public async Task StartAsync(IDialogContext context)
{
PromptDialog.Choice(...);
}
的問題是根對話多個消息到達。至少有兩個「對話更新」消息,一個用於添加機器人,另一個用於添加用戶。
提示對話框將這些解釋爲答案,當然它們與可用的提示選項不匹配。因此,提示對話框再次嘗試並再次顯示。因此,我總是會在對話開始時收到多個提示。
我將其追蹤到dialog中的消息處理程序,並且看到它不檢查消息類型。作爲一種變通方法我已經創建了自己的提示對話框而忽略所有的非消息類型的活動,現在它按預期工作:
[Serializable]
public class CustomPromptDialog : PromptChoice<string>
{
public CustomPromptDialog(string title, params string [] buttons) : base(
new PromptOptions<string>(prompt: title, retry: "", tooManyAttempts: "", options: new List<string>(buttons), attempts: 2, promptStyler: null))
{
}
protected async override Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> message)
{
var activity = await message;
// This is what is IMHO missing in the built-in version.
if(activity.Type != ActivityTypes.Message)
{
return;
}
await base.MessageReceivedAsync(context, message);
}
}
我使用提示錯誤或者是在框架中的錯誤?
你可以添加你的MessageController的代碼嗎?您不應該將ConversationUpdate消息路由到您的對話框 –
嗯,這是事情:如果我想主動顯示選擇對話框,我必須對_something_做出反應,這意味着對話更新;我不想等待第一個傳入的用戶消息。我真的不得不在_last_傳入會話更新中顯示提示對話框,但我怎麼知道有多少人? – Krumelur
您只需通過使用'message.MembersAdded:'上的一個檢查來篩選conversationUpdate對話框,該id應該與'message.Recipient.Id'不同以排除機器人。這就是爲什麼我要求你的MessageController的代碼;) –