2017-01-23 49 views
1

我正在使用Microsft BotFramework。Bot Framework - 多個延遲的答案

進程: 客戶要求我的機器人生成一個特定的代碼 1.機器人對客戶端的答案是他正在生成代碼。 2.大約10秒鐘後,機器人將代碼發送給客戶端,沒有任何其他請求。

問題: 我使用

ReplyToActivityAsync(...) 

方法return語句之前發送兩個答案。 在這種情況下,2個答案之間有一個發佈超時錯誤。

這是我的代碼:

 if (activity.Type == ActivityTypes.Message) 
     { 
      ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl)); 

      // return our reply to the user 
      string welcomeMessage = "[...] Reply 1 [...]" 
      await connector.Conversations.ReplyToActivityAsync(activity.CreateReply(welcomeMessage)); 

      // MyApi.GetCode() takes about 10 secs 
      await connector.Conversations.ReplyToActivityAsync(activity.CreateReply(MyAPI.GetCode())); 
     } 

如何開始的回覆無需等待用戶請求? 謝謝!

+0

如果在第二次調用中使用SendToConversationAsync而不是使用ReplyToActivityAsync,會發生什麼情況? –

+0

完全一樣。 – Jonathan

+0

是的,我想象。如果不是發送MyAPI.GetCode(),而是發送其他類似「hello」的東西,它只是正常工作?我懷疑問題出在你的GetCode方法中...是否有任何改變來使該方法異步? –

回答

0

您可以使用收件人的ID發送郵件,而不需要用戶的請求,如下所示。因此,您可以在通過api調用成功響應並延遲發送消息給用戶之後,也可以在另一個函數中發送消息。

string userId ="123456789"; // For Example 
string serviceUrl = "https://telegram.botframework.com"; // For Example 

var connector = new ConnectorClient(new Uri(serviceUrl)); 
IMessageActivity newMessage = Activity.CreateMessageActivity(); 
newMessage.Type = ActivityTypes.Message; 
newMessage.From = new ChannelAccount("<BotId>", "<BotName>"); 
newMessage.Conversation = new ConversationAccount(false, userId); 
newMessage.Recipient = new ChannelAccount(userId); 
newMessage.Text = "<MessageText>"; 
await connector.Conversations.SendToConversationAsync((Activity)newMessage); 

在上面,你可以用他的身份證在相關通道將消息發送給用戶。另外,serviceUrl是基於相關通道定義的(這裏以Telegram爲例)。