在bot中无提示启动对话框(对于C#)
我正在用C#构建一个带有Microsoft bot框架V3的机器人,并尝试在用户输入任何输入之前启动对话框并用说明“欢迎”用户。我还希望每次用户完成表单时都重复该对话框 我正在尝试使用FormFlow选项:FormOptions.prompinstart,但只有在他们输入一些输入后,欢迎消息才会出现。我不确定这是V1不推荐的,还是我做得不对。有什么建议吗 我的课程如下: MessagesController:在bot中无提示启动对话框(对于C#),c#,dialog,bots,botframework,C#,Dialog,Bots,Botframework,我正在用C#构建一个带有Microsoft bot框架V3的机器人,并尝试在用户输入任何输入之前启动对话框并用说明“欢迎”用户。我还希望每次用户完成表单时都重复该对话框 我正在尝试使用FormFlow选项:FormOptions.prompinstart,但只有在他们输入一些输入后,欢迎消息才会出现。我不确定这是V1不推荐的,还是我做得不对。有什么建议吗 我的课程如下: MessagesController: internal static IDialog<MyClass&
internal static IDialog<MyClass> MakeRootDialog()
{
return Chain.From(() => FormDialog.FromForm(MyClass.BuildForm, options: FormOptions.PromptInStart))
.Do(async (context, order) =>
{//some actions here }
});
}
内部静态IDialog MakeRootDialog()
{
返回链.From(()=>FormDialog.FromForm(MyClass.BuildForm,选项:FormOptions.PrompInstart))
.Do(异步(上下文、顺序)=>
{//此处有一些操作}
});
}
MyClass.cs:
[Serializable]
public class MyClassDialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var message = await argument;
await context.PostAsync("You said: " + message.Text);
context.Wait(MessageReceivedAsync);
}
}
[可序列化]
公共类MyClassDialog:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable参数)
{
var message=等待参数;
wait context.PostAsync(“你说:“+message.Text”);
Wait(MessageReceivedAsync);
}
}
MyClassDialog.cs:
public class MyClass
{
public static IForm<MyClass> BuildForm()
{
OnCompletionAsyncDelegate<MyClass> processOrder = async (context, state) =>
{
await context.PostAsync("We are currently filing your order.....");
};
return new FormBuilder<MyClass>()
.Message("Welcome to my bot!")
//some actions here
.Confirm(//more actions here)
.AddRemainingFields()
.Message("Thanks for providing your inputs")
.OnCompletion(processOrder)
.Build();
}
};
公共类MyClass
{
公共静态表单BuildForm()
{
OnCompletionAsyncDelegate processOrder=async(上下文、状态)=>
{
wait context.PostAsync(“我们目前正在提交您的订单…”);
};
返回新的FormBuilder()
.Message(“欢迎使用我的机器人!”)
//这里有一些行动
.Confirm(//此处有更多操作)
.AddRemainingFields()
.Message(“感谢您提供的信息”)
.OnCompletion(processOrder)
.Build();
}
};
您正在使用模拟器进行测试吗
我有过类似的经历,这似乎取决于客户。我在本地emulator中获得了与您相同的体验,但当我通过webchat客户端运行它时,我看到了欢迎消息:
我从webchat中添加了一个屏幕转储:如何实现Post方法? 我认为你在形式上没有问题,但在方法上有问题 这个代码对我有用
public async Task<HttpResponseMessage> Post([FromBody] Activity activity)
{
if (activity.Type == ActivityTypes.Message || activity.Type == ActivityTypes.ConversationUpdate)
{
Conversation.SendAsync(activity, MakeRootDialog);
{
}
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message | | activity.Type==ActivityTypes.ConversationUpdate)
{
SendAsync(活动,MakeRootDialog);
{
}
因为如果用户连接,ActivityType是ConversationUpdate,没有消息。当activity.Type==ActivityTypes.ConversationUpdate时,您必须调用MakeRootDialog。您可以检查message.Type==ActivityTypes.ConversationUpdate和message.MembersAdded.Any(o=>o.Id==message.Recipient.Id)
ref from
是的,我们使用emulator进行了测试,但是WebChat中也有同样的问题。我们意识到这是Dialog类的问题。
private async Task HandleSystemMessage(Activity message)
{
if (message.Type == ActivityTypes.DeleteUserData)
{
// Implement user deletion here
// If we handle user deletion, return a real message
}
else if (message.Type == ActivityTypes.ConversationUpdate)
{
if (message.MembersAdded.Any(o => o.Id == message.Recipient.Id))
{
var RootDialog_Welcome_Message = "welcome! i'm rainmaker";
var reply = message.CreateReply(RootDialog_Welcome_Message);
ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));
await connector.Conversations.ReplyToActivityAsync(reply);
}
}
else if (message.Type == ActivityTypes.ContactRelationUpdate)
{
// Handle add/remove from contact lists
// Activity.From + Activity.Action represent what happened
}
else if (message.Type == ActivityTypes.Typing)
{
// Handle knowing tha the user is typing
}
else if (message.Type == ActivityTypes.Ping)
{
}
}