2016-07-25 41 views
1

我正在用C#中Microsoft Bot Framework V3构建一个bot,并试图让Dialog在输入任何输入之前开始并“欢迎”用户指令。每次用户完成表单时,我都会重复对话框。在bot中没有提示的情况下启动对话框(对于C#)

我在尝试使用FormFlow选项:FormOptions.PromptInStart,但它仍然只有在输入一些输入后才会显示欢迎消息。不知道这是否被V1弃用,或者我只是做得不对。任何建议?

我的类如下:

MessagesController:

 internal static IDialog<MyClass> MakeRootDialog() 
    { 
     return Chain.From(() => FormDialog.FromForm(MyClass.BuildForm, options: FormOptions.PromptInStart)) 
      .Do(async (context, order) => 
      {//some actions here } 
      }); 
    } 

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.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(); 
    } 

}; 

回答

0

你测试使用模拟器?

我有过类似的经历,它似乎取决于客户端。我让你在我的本地模拟器有同样的经历,但我看到的欢迎信息就好了,当我通过网上聊天客户端运行它:https://docs.botframework.com/en-us/support/embed-chat-control2/

我说从我的网络聊天一个screendump:Welcome message in webchat

+0


裁判是的,我们是使用模拟器进行测试,但在WebChat中遇到同样的问题。意识到这是我们的Dialog类的一个问题。 – kgonzal3

1

你如何实现Post方法? 我觉得你没有问题的形式,但在Post方法。

此代码适用于我。

public async Task<HttpResponseMessage> Post([FromBody] Activity activity) 
{ 

      if (activity.Type == ActivityTypes.Message || activity.Type == ActivityTypes.ConversationUpdate) 
      { 
       Conversation.SendAsync(activity, MakeRootDialog); 
      { 
} 

因为如果用户连接,ActivityType是ConversationUpdate,则没有消息。当activity.Type == ActivityTypes.ConversationUpdate也必须调用MakeRootDialog。

1

,您可以检查message.Type == ActivityTypes.ConversationUpdate和message.MembersAdded.Any(O => o.Id == message.Recipient.Id)从BotBuilder-Samples/CSharp/demo-ContosoFlowers/

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) 
    { 
    } 
} 
相关问题