2017-06-15 4 views
2

C#, Microsoft.Bot.Builder 3.5.5Facebook persistent Menü Postbacks nicht-Controller schlägt

Die chatbot funktioniert gut, aber wenn eine Taste Postbacks aus dem persistenten Menü ausgewählt wird, zeigt die chatbot die Typisierung Animation für 20 Sekunden vor dem Ausfall ohne Nachricht. Das Eingeben der genauen Nachricht funktioniert gut, in der Tat sollte jede Nachricht eine Antwort haben. Ich habe auch die Channel-Probleme auf dev.botframework.com untersucht und nichts, was damit zu tun hat, taucht auf.

Bearbeiten: Ich verwende nicht einmal eine Logik, um eine Tippnachricht anzuzeigen. Es erscheint nur für das Menü.

+0

sind in der Lage Sie Ihren Code zu schreiben, damit wir einen Blick Freund nehmen? – JasonSowers

+0

Nun, es erreicht nicht einmal meinen Code. Es ist noch nicht einmal in 'öffentliche asynchrone Aufgabe eingeben Post ([FromBody] Aktivität Aktivität)' Es sei denn Sie meinen persistent Menü. Ich habe den von [hier] kopiert und eingefügt (https://developers.facebook.com/docs/messenger-platform/messenger-profile/persistent-menu) und es ist erfolgreich, der Bot reagiert einfach nicht auf Postbacks von der Speisekarte. – Russell

+0

Das passiert bei mir auch auf NodeJS, es erreicht nicht einmal die erste Middleware (die Anfrage an den Server wird überhaupt nicht gestellt). Aber "manchmal" funktioniert es: S – Mzn

Antwort

1

Sie können versuchen, vorgeschlagene Aktion anstelle des persistenten Menüs zu verwenden. Sie können über Informationen finden suggested actions here Sie sollten auch auf die neueste Version aktualisieren ist botbuilder von 3.8.1

Hier ist eine einfache Implementierung:

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Connector; 

namespace SuggestedActions.Dialogs 
{ 
    [Serializable] 
    public class RootDialog : IDialog<object> 
    { 
     public Task StartAsync(IDialogContext context) 
     { 
      context.Wait(MessageReceivedAsync); 

      return Task.CompletedTask; 
     } 

     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) 
     { 
      var activity = await result as Activity; 
      var reply = activity.CreateReply("I have colors in mind, but need your help to choose the best one."); 
      reply.Type = ActivityTypes.Message; 
      reply.TextFormat = TextFormatTypes.Plain; 
      reply.SuggestedActions = new Microsoft.Bot.Connector.SuggestedActions() 
      { 
       Actions = new List<CardAction>() 
       { 
        new CardAction(){ Title = "Blue", Type=ActionTypes.ImBack, Value="Blue" }, 
        new CardAction(){ Title = "Red", Type=ActionTypes.ImBack, Value="Red" }, 
        new CardAction(){ Title = "Green", Type=ActionTypes.ImBack, Value="Green" } 
       } 
      }; 
      // return our reply to the user 
      await context.PostAsync(reply); 
      context.Wait(MessageReceivedAsync); 
     } 
    } 
} 
1

Nehmen wir an, dass, wenn Sie persistent Menü erstellt, Sie Anfrage gemacht haben Book ähnlich wie diese:

{ 
    "persistent_menu":[ 
    { 
     "locale":"default", 
     "composer_input_disabled":true, 
     "call_to_actions":[ 
     { 
      "title":"My Account", 
      "type":"nested", 
      "call_to_actions":[ 
      { 
       "title":"Pay Bill", 
       "type":"postback", 
       "payload":"PAYBILL_PAYLOAD" 
      }, 
      { 
       "title":"History", 
       "type":"postback", 
       "payload":"HISTORY_PAYLOAD" 
      }, 
      { 
       "title":"Contact Info", 
       "type":"postback", 
       "payload":"CONTACT_INFO_PAYLOAD" 
      } 
      ] 
     }, 
     { 
      "type":"web_url", 
      "title":"Latest News", 
      "url":"http://petershats.parseapp.com/hat-news", 
      "webview_height_ratio":"full" 
     } 
     ] 
    }, 
    { 
     "locale":"zh_CN", 
     "composer_input_disabled":false 
    } 
    ] 
} 

bekam ich diesen Json aus offiziellen docs.

Wenn also ein Benutzer ein Element dieses persistenten Menüs mit "type":"postback" antrifft, wird Ihre empfangene Nachricht angezeigt. Text entspricht payload.

Ihr Code für Postbacks Umgang mit so etwas wie dies sein sollte:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
     { 

     var msg = await argument; 
     switch (s) 
      { 
      case "CONTACT_INFO_PAYLOAD" : 
      YourMethod(); 
      break; 
      } 

Hoffe, es hilft :)

+0

Danke für die Antwort. Das Problem ist, bevor ich ihnen einen Dialog verschicke, es sollte unseren Controller treffen, aber es ist nicht so, ich bekomme nicht einmal die Aktivität, um überhaupt welche Aktivität zu sehen. Text ist. Nachrichten außerhalb des persistenten Menüs funktionieren alle gut und treffen unseren Controller. Ich kann meine eigenen Facebook-Buttons innerhalb des Bot mit ihrer eigenen Payload erstellen und alles funktioniert gut, nur nicht das persistente Menü. – Russell

+0

Aktualisieren Sie Ihre Bot-Version? Melde dies Facebook? –