首页 文章

Bot Framework bot无法在未提示的情况下在Microsoft Teams Channels 中发布

提问于
浏览
1

我有一个使用Microsoft Bot Framework构建的机器人,在Azure App Service中发布,我希望在Microsoft Teams Channels 中发布以响应POST调用 . 我在WebhookAPIController类中有以下内容,继承自ApiController:

[HttpPost]
[Route("api/WebhookAPI")]
public async Task<HttpResponseMessage> RespondToWebhook([FromBody] PostTestModel value)
{
    try
    {
        await CreateChannelConversation(value.text);
        var resp = new HttpResponseMessage(HttpStatusCode.OK);
        return resp;
    }
    catch (Exception ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
    }            
}

private async Task CreateChannelConversation(string value)
{
    var connector = new ConnectorClient(new Uri(System.Configuration.ConfigurationManager.AppSettings["serviceUrl"]));
    var channelData = new Dictionary<string, string>();
    channelData["teamsChannelId"] = System.Configuration.ConfigurationManager.AppSettings["ChannelId"];
    IMessageActivity newMessage = Activity.CreateMessageActivity();
    newMessage.Type = ActivityTypes.Message;
    newMessage.Text = "Hello channel.";
    ConversationParameters conversationParams = new ConversationParameters(
        isGroup: true,
        bot: null,
        members: null,
        topicName: "Test Conversation",
        activity: (Activity)newMessage,
        channelData: channelData);
    var result = await connector.Conversations.CreateConversationAsync(conversationParams);
}

此代码从AppSettings获取服务URL和通道ID;据我所知,对于给定的团队 Channels , Channels ID永远不会改变 . 但是,当我对(bot URL)/ api / WebhookAPI进行POST调用时,没有消息被发布,我收到此错误消息作为响应:

{
    "message": "An error has occurred.",
    "exceptionMessage": "Authorization for Microsoft App ID [ID omitted] failed with status code Unauthorized and reason phrase 'Unauthorized'",
    "exceptionType": "System.UnauthorizedAccessException",
    "stackTrace": "   at Microsoft.Bot.Connector.JwtTokenRefresher.<SendAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)\r\n   at Microsoft.Bot.Connector.Conversations.<CreateConversationWithHttpMessagesAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.Bot.Connector.ConversationsExtensions.<CreateConversationAsync>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at WebhookTestBot.Controllers.WebhookAPIController.<CreateChannelConversation>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at WebhookTestBot.Controllers.WebhookAPIController.<RespondToWebhook>d__1.MoveNext()",
    "innerException": {
    "message": "An error has occurred.",
    "exceptionMessage": "Response status code does not indicate success: 401 (Unauthorized).",
    "exceptionType": "System.Net.Http.HttpRequestException",
    "stackTrace": "   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()\r\n   at Microsoft.Bot.Connector.JwtTokenRefresher.<SendAsync>d__2.MoveNext()"
}

但是,如果我首先在通道中输入机器人,则POST调用返回200并且机器人在通道中发布 . 有没有办法可以配置我的机器人能够在没有被提及的情况下在 Channels 中发布?

3 回答

  • 3

    得到它的工作,感谢this answer . 在调用CreateConversationAsync()之前,将以下代码添加到CreateChannelConversation():

    MicrosoftAppCredentials.TrustServiceUrl(ConfigurationManager.AppSettings["serviceUrl"], DateTime.MaxValue);

  • 0

    那么你是在对serviceUrl和ChannelID进行硬编码吗?当你提到它时, Channels ID是否与机器人接收的内容相匹配?它应该看起来像这样:"19:693ecdb923ac4458a5c23661b505fc84@thread.skype"另请注意:the teamsChannelId is being deprecated in the future,所以你应该改为channelData.channel.id . 我将更新MSDN上的示例代码 .

    无论如何,您的代码应该可以正常运行,假设硬编码的值与您所在的 Channels 匹配,并且在我的测试用例中有效 .

    你说你首先@mention机器人,它的工作原理 . 你能解释一下你的测试用例吗?

  • 0

    尝试将凭据添加到ConnectorClient构造函数:

    string appId = ConfigurationManager.AppSettings["MicrosoftAppId"];
    string appPassword = ConfigurationManager.AppSettings["MicrosoftAppPassword"];
    var appCredentials = new MicrosoftAppCredentials(appId, appPassword);
    var connector = new ConnectorClient(new Uri(ConfigurationManager.AppSettings["serviceUrl"]), appCredentials );
    

相关问题