0

TL; DR: Der Bot braucht 2-9 Sekunden, um eine Nachricht an den Benutzer zu senden, auch wenn ich die Nachricht von der allerersten Zeile in MessagesController.cs sende.Gibt es eine Möglichkeit, die Nachrichten in Facebook Messenger zu "bündeln"?


Ich habe den Bot-Framework verwendet, um ein paar Bots für Facebook Messenger zu schaffen, und ich bemerkte, dass einer von ihnen ist deutlich langsamer als die andere.

Beide Bots haben den Code unten als die ersten Zeilen in der MessagesController.cs. Dies soll den Typisierungsindikator an den Benutzer senden.

Ein Bot dauert konsistent 2 Sekunden, um dem Benutzer auf Facebook diese Tippanzeige anzuzeigen, während der andere 9 Sekunden dauert.

  Activity typing = activity.CreateReply(null); 
      typing.ServiceUrl = activity.ServiceUrl; 
      typing.Type = ActivityTypes.Typing; 
      ConnectorClient connector = new ConnectorClient(new Uri(typing.ServiceUrl)); 
      await connector.Conversations.SendToConversationAsync(typing); 

Der zweite bot in der Tat nicht viel mehr Arbeit (verschiedene Web-APIs aufrufen), aber da diese Linien die erste in der Steuerung sind, erwarte ich, dass die Eingabe-Anzeige für den Benutzer sofort gesendet werden soll, wonach der Bot kann seine Arbeit fortsetzen.

Es scheint jedoch, dass die Nachrichten (einschließlich der Typisierungsindikator) nicht gesendet werden, bis der Bot seine Arbeit abgeschlossen hat.

Gibt es eine Möglichkeit, die Nachrichten an den Benutzer zu "bündeln", um sofort einen Tippfehler zu erhalten, oder stoße ich auf ein anderes Problem?


Update: Ich habe die ConnectorClient.Dispose() Methode versucht, aber es scheint nicht zu helfen, es schneller zu machen, Nachrichten zu senden.

Antwort

3

Ich bin mir nicht sicher, was Sie meinen, indem Sie die Nachrichten an den Benutzer "spülen", aber Ihr Bot sollte das Tipp-Zeichen sofort anzeigen, bis Sie eine Nachricht eingeben und ein Prozess im Hintergrund läuft. Um zu vermeiden, die Verarbeitung von Informationen, bis der Benutzer tippt eine Nachricht können Sie die ACTIVITY wie folgt verwenden:

 if (activity.Type == ActivityTypes.Message) 
     { 
      Activity typing = activity.CreateReply(null); 
      typing.ServiceUrl = activity.ServiceUrl; 
      typing.Type = ActivityTypes.Typing; 
      ConnectorClient connector = new ConnectorClient(new Uri(typing.ServiceUrl)); 
      await connector.Conversations.SendToConversationAsync(typing); 
     } 
     else 
     { 
      HandleSystemMessage(activity); 
     } 
     ... 

Allerdings macht es Sinn, dass der Benutzer nichts geben kann, bis die Anwendung bereits eine Antwort zurück auf die vorherige Frage gegeben hat.

Verwandte Themen