Botframework 主动Bot消息传递-CreateDirectConversation-未经授权的异常

Botframework 主动Bot消息传递-CreateDirectConversation-未经授权的异常,botframework,Botframework,我正在创建一个机器人,以便主动与我以前从未与之进行过对话的帐户开始对话。我已经创建了另一个控制器,我将发布到该控制器并执行以下步骤: public class OutboundController : ApiController { public HttpResponseMessage Post([FromUri] int id, [FromBody] OutboundData outboundData) { MicrosoftAppCredentials.TrustServiceUr

我正在创建一个机器人,以便主动与我以前从未与之进行过对话的帐户开始对话。我已经创建了另一个控制器,我将发布到该控制器并执行以下步骤:

  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应用程序ID[ID]的授权失败,状态代码为Unauthorized,原因短语为“Unauthorized”。如果我使用appId和password blank执行此操作,那么通道仿真器中的一切都会正常工作。我已尝试向ConnectorClient的构造函数提供MicrosoftAppCredentials,但这没有任何影响。我在其他线程上读到服务URL必须可信,因此我使用了MicrosoftAppCredentials.TrustServiceUrl

我正在使用的版本: BotBuilder 3.5.3 通道仿真器3.0.0.59

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

我也看了一下:但我不太理解评论中描述的解决方案,或者它是否与我试图解决的问题有关


任何建议或帮助将不胜感激

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

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

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

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

@artem的可能重复场景有点不同,因为我没有恢复之前的传入对话。我正在发起一次新的对话。在您提供的链接中,有人问起CreateDirectConversationAsync,您回答“我当然问了。它不起作用。显然,错误与创建对话的方式无关。”我想知道我是否必须首先将帐户数据发布到连接器api,以便连接器能够完全信任会话创建。可能的@artem副本场景有点不同,因为我没有恢复以前的传入会话。我正在发起一次新的对话。在您提供的链接中,有人问起CreateDirectConversationAsync,您回答“我当然问了。它不起作用。显然,错误与创建对话的方式无关。”我想知道我是否必须先将帐户数据发布到连接器api,以便连接器可以完全信任会话创建。我已经尝试过此操作,但在尝试创建直接会话时仍会遇到未经授权的错误。是否不依赖于我用来创建对话的频道帐户?它们必须是特定的机器人Id/名称吗?我将看一下代码,看看createDirectConversation在做什么。我确实用您发布的代码重现了这个问题。通过证书为我解决了这个问题。但是,我可以看到您将botAccountId设置为outboundData.FromAccountId。我猜FromAccount是一个用户帐户,不是吗?您不应该交换它们吗?以下是示例出站数据:{“ChannelId”:“emulator”,“ToAccountName”:“Jay Tina”,“ToAccountId”:“+5555”,“FromAccountName”:“OutboundTestApp”,“FromAccountId”:“OutboundTestApp-1”,“ServiceUrl”:“}FromAccountId是否需要是我在发布的应用程序的web.config中定义的BotId?我正在用通道仿真器进行测试。我能够让我的机器人在仿真器中启动与用户的对话。需要注意的是,我必须首先生成一个传入的conversationUpdate,检索那些频道帐户,然后最终开始直接对话。我在另一个线程上读到,直接对话只能通过以前与您的机器人(入站)交互过的频道帐户启动。这是真的吗?为了能够开始对话,你的机器人需要知道用户帐户的信息(Id)。所以,上面的陈述是正确的,因为机器人在第一次交互后才知道这些信息。我已经尝试过了,当我尝试创建直接对话时,我仍然收到一个未经授权的错误。是否不依赖于我用来创建对话的频道帐户?它们必须是特定的机器人Id/名称吗?我将看一下代码,看看createDirectConversation在做什么。我确实用您发布的代码重现了这个问题。通过证书为我解决了这个问题。但是,我可以看到您将botAccountId设置为outboundData.FromAccountId。我猜FromAccount是一个用户帐户,不是吗?您不应该交换它们吗?以下是示例出站数据:{“ChannelId”:“emulator”,“ToAccountName”:“Jay Tina”,“ToAccountId”:“+5555”,“FromAccountName”:“OutboundTestApp”,“FromAccountId”:“OutboundTestApp-1”,“ServiceUrl”:“}FromAccountId是否需要是我在发布的应用程序的web.config中定义的BotId?我正在用通道仿真器进行测试。我能够让我的机器人在仿真器中启动与用户的对话。需要注意的是,我必须首先生成一个传入的conversationUpdate,检索那些频道帐户,然后最终开始直接对话。我在另一个线程上读到,直接对话只能通过以前与您的机器人(入站)交互过的频道帐户启动。这是真的吗?为了能够开始对话,你的机器人需要知道用户帐户的信息(Id)。因此,上面的陈述是正确的,因为bot只在第一次交互之后才知道这些信息