2017-01-25 64 views
0

我們正在爲我們的聊天機器人使用Microsoft Bot框架。我們的消息控制器是標準的:單體與Bot框架

public async Task<HttpResponseMessage> Post([FromBody] Activity activity) 
{ 
     HttpResponseMessage response; 
     try 
     { 
     if (activity.Type == ActivityTypes.Message) 
     { 
      //do some stuff 

       await Conversation.SendAsync(activity,() => new RootDialog()); 
      } 
      else 
      { 
       HandleSystemMessage(activity); 
      } 

      response = this.Request.CreateResponse(HttpStatusCode.OK); 
     } 
     catch (Exception ex) 
     { 
      //do some catching 
     } 
    return response; 
} 

有時候,機器人需要有很長的獨白。如果時間太長,我們會收到502錯誤網關錯誤。

任何解決方案?

+0

可能重複:http://stackoverflow.com/questions/41810912/bot-framework-multiple-delayed-answers/41913696 – OmG

回答

2

Bot框架在15秒後調用超時。您的機器人必須在15秒內返回一個成功的HTTP狀態代碼,以便Direct Line考慮成功發送消息。

如果您的機器人執行大量離線工作或發送多條消息,則應將該工作移至後臺線程,以便在15秒內完成傳入請求。

下面是一個正確處理ASP.Net和其他宿主環境中負載的代碼片段。

if (HostingEnvironment.IsHosted) 
{ 
    HostingEnvironment.QueueBackgroundWorkItem(c => DoWorkAsync()); 
} 
else 
{ 
    Task.Run(() => DoWorkAsync()); 
} 

... 

private async Task DoWorkAsync() 
{ 
    // do some stuff 
} 

Task.Run是簡單,但HostingEnvironment.QueueBackgroundWorkItem防止ASP.Net從拆除的過程之前,這項工作就完成了。

+0

謝謝丹!將此代碼放入消息控制器中可以嗎?即替換/ /做一些東西 await Conversation.SendAsync(activity,()=> new RootDialog()); 由異步調用。這樣每次我們發送消息時,它都會運行異步? – ben