主动机器人消息传递 - CreateDirectConversation - 未经授权的异常

Proactive Bot Messaging - CreateDirectConversation - unauthorized exception

我正在创建一个机器人来主动与我以前从未与之交谈过的帐户开始对话。我创建了另一个我正在 post 并执行以下步骤的控制器:

  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 时出现以下异常:附加信息:Microsoft App ID [ID] 的授权失败,状态代码未授权,原因短语 'Unauthorized'。如果我使用 appId 和密码空白执行此操作,则在通道模拟器中一切正常。我已尝试将 MicrosoftAppCredentials 提供给 ConnectorClient 的构造函数,但这没有任何影响。我在其他线程上读到必须信任服务 URL,所以我使用了 MicrosoftAppCredentials.TrustServiceUrl。

我使用的版本: BotBuilder 3.5.3 频道模拟器 3.0.0.59

我的机器人的用例是 post 向带有一些用户信息的出站控制器创建要发送的主动消息(特别是 SMS)。如果用户响应我的消息,它将被消息控制器拦截并传递到我的对话框,以便在同一频道上进行进一步处理和对话响应。

我也看过:https://github.com/Microsoft/BotBuilder/issues/2155 但不太理解评论中描述的解决方案,或者它是否与我要解决的问题有关。

如有任何建议或帮助,我们将不胜感激!

您需要将凭据显式传递给连接器:

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