在bot中无提示启动对话框(对于C#)

在bot中无提示启动对话框(对于C#),c#,dialog,bots,botframework,C#,Dialog,Bots,Botframework,我正在用C#构建一个带有Microsoft bot框架V3的机器人,并尝试在用户输入任何输入之前启动对话框并用说明“欢迎”用户。我还希望每次用户完成表单时都重复该对话框 我正在尝试使用FormFlow选项:FormOptions.prompinstart,但只有在他们输入一些输入后,欢迎消息才会出现。我不确定这是V1不推荐的,还是我做得不对。有什么建议吗 我的课程如下: MessagesController: internal static IDialog<MyClass&

我正在用C#构建一个带有Microsoft bot框架V3的机器人,并尝试在用户输入任何输入之前启动对话框并用说明“欢迎”用户。我还希望每次用户完成表单时都重复该对话框

我正在尝试使用FormFlow选项:FormOptions.prompinstart,但只有在他们输入一些输入后,欢迎消息才会出现。我不确定这是V1不推荐的,还是我做得不对。有什么建议吗

我的课程如下:

MessagesController:

        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)
    {
    }
}