2017-03-21 30 views
1

我正在創建一個機器人主動地開始與我之前從未進行過對話的帳戶的對話。我已經創造了另一個控制器,我張貼並執行以下步驟:主動的Bot消息傳遞 - CreateDirectConversation - 未授權的異常

public class OutboundController : ApiController { 
public HttpResponseMessage Post([FromUri] int id, [FromBody] OutboundData outboundData) { 

    MicrosoftAppCredentials.TrustServiceUrl(outboundData.ServiceUrl); 

    //create conversation 
    var connector = new ConnectorClient(new Uri(outboundData.ServiceUrl)); 

    var botAccount = new ChannelAccount { Id = outboundData.FromAccountId, Name = outboundData.FromAccountName }; 
    var toAccount = new ChannelAccount { Id = outboundData.ToAccountId, Name = outboundData.ToAccountName }; 

    if(!MicrosoftAppCredentials.IsTrustedServiceUrl(outboundData.ServiceUrl)) { 
    throw new Exception("service URL is not trusted!"); 
    } 
    var conversationResponse = connector.Conversations.CreateDirectConversation(botAccount, toAccount); 

    var client = new BuslogicClient(); 
    var confirmData = client.GetOutboundData(id); 
    var greetingMessage = CreateGreetingMessage(confirmData); 

    var convoMessage = Activity.CreateMessageActivity(); 
    convoMessage.Text = greetingMessage; 
    convoMessage.From = botAccount; 
    convoMessage.Recipient = toAccount; 
    convoMessage.Conversation = new ConversationAccount(id: conversationResponse.Id); 
    convoMessage.Locale = "en-Us"; 
    connector.Conversations.SendToConversationAsync((Activity)convoMessage); 


    string message = string.Format("I received correlationid:{0} and started conversationId:{1}", id, conversationResponse.Id); 
    var response = Request.CreateResponse(HttpStatusCode.OK, message); 
    return response; 
} 

當我打電話connector.Conversations.CreateDirectConversation我收到以下異常:附加信息:授權微軟的App ID [ID]失敗狀態碼未經授權,原因短語'未經授權'。如果我使用appId和密碼爲空來做到這一點,那麼在通道模擬器中一切正常。我已經嘗試將MicrosoftAppCredentials提供給ConnectorClient的構造函數,但這沒有任何影響。我讀過其他線程的服務URL必須是可信的,所以我使用了MicrosoftAppCredentials.TrustServiceUrl。

版本我使用: BotBuilder 3.5.3 信道仿真器3.0.0.59

用例爲我的機器人是張貼到一些用戶信息來創建一個積極的消息出站控制器發送(特別是SMS)。如果用戶對我的消息作出響應,它將被消息控制器攔截並傳遞到我的對話框,以便在同一頻道上進行進一步處理和對話響應。

我也看過:https://github.com/Microsoft/BotBuilder/issues/2155,但不太理解評論中描述的解決方案,或者它甚至與我試圖解決的問題有關。

任何建議或幫助,將不勝感激!

+0

的[發起消息從BOT到用戶上BotFramework](可能的複製http://stackoverflow.com/questions/42749982/initiate-a-消息從機器人到用戶在機器人框架) – Artem

+0

@artem該場景有點不同,因爲我沒有恢復以前的傳入對話。我正在發起一個新的談話。在你提供了一個關於CreateDirectConversationAsync的問題的鏈接中,你回答「\t 」確定我做了。它不起作用。顯然,錯誤與創建對話方式無關「我想知道是否必須發佈到連接器api帳戶數據首先使連接器可以完全信任對話創建。 –

回答

0

您需要明確地傳遞憑據連接器:

var credentials = new MicrosoftAppCredentials("YoursMicrosoftAppId", "YoursMicrosoftAppPassword"); 
var connector = new ConnectorClient(serviceUrl, credentials); 
+0

我已經試過這個,當我嘗試創建直接對話時,我仍然收到未經授權的錯誤。我沒有依賴於用於創建對話的渠道帳戶?他們必須是特定的機器人ID /名稱嗎?我將查看代碼以查看createDirectConversation正在做什麼。 –

+0

我沒有用您發佈的代碼重現問題。通過憑證解決了我的問題。不過,我可以看到你設置botAccountId爲outboundData.FromAccountId。我猜FromAccount是一個用戶帳戶,不是嗎?你不應該交換嗎? – Artem

+0

下面是示例出站數據:{ \t 「渠道ID」: 「模擬器」, \t 「ToAccountName」: 「周杰倫蒂娜」, \t 「ToAccountId」: 「5555555555」, \t 「FromAccountName」: 「OutboundTestApp」, \t 「FromAccountId」: 「OutboundTestApp-1」, \t 「的serviceUrl」: 「HTTP://本地主機:9000」 }是否FromAccountId必須BOTID我在發佈的應用的web.config中定義?我正在使用通道模擬器進行測試。 –