2016-07-25 11 views
1

Ich baue einen Bot mit dem Microsoft Bot Framework, V3, in C# und versuche, den Dialog zu starten und den Benutzer mit Anweisungen zu "begrüßen", bevor sie irgendeine Eingabe eingeben. Ich möchte auch, dass der Dialog jedes Mal wiederholt wird, wenn der Benutzer das Formular ausfüllt.Startdialog ohne Eingabeaufforderung in Bot (für C#)

Ich versuche, die FormFlow-Optionen zu verwenden: FormOptions.PromptInStart, aber es wird immer noch die Willkommensnachricht angezeigt, erst nachdem sie einige Eingaben eingegeben haben. Nicht sicher, ob dies mit V1 veraltet ist oder ich mache es einfach nicht richtig. Irgendein Rat??

sind meine Klassen wie folgt:

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

}; 

Antwort

0

testen Sie die Verwendung von Emulator?

Ich hatte eine ähnliche Erfahrung und es scheint, es hängt vom Client ab. Ich erhalte die gleiche Erfahrung, die Sie in meinem lokalen Emulator, aber ich sehe die Begrüßungsnachricht nur gut, wenn ich es durch den Webchat Client ausführen: https://docs.botframework.com/en-us/support/embed-chat-control2/

Ich habe eine Screendump von meinem Webchat: Welcome message in webchat

+0

Ja, überprüfen wir waren Testen mit Emulator, aber hatten das gleiche Problem in WebChat. Es war ein Problem mit unserer Dialog-Klasse. – kgonzal3

1

Wie implementieren Sie die Post-Methode? Ich denke, Sie haben kein Problem in Form, sondern in Post-Methode.

Dieser Code funktioniert für mich.

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

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

Da, wenn Benutzer verbinden, ActivityType ist ConversationUpdate, keine Nachricht. Sie müssen MakeRootDialog aufrufen, wenn activity.Type == ActivityTypes.ConversationUpdate.

1

können Sie message.Type == ActivityTypes.ConversationUpdate und message.MembersAdded.Any (o => o.Id == message.Recipient.Id)
ref von 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) 
    { 
    } 
}