c# - Bot Framework 机器人无法在没有提示的情况下在 Microsoft Teams channel 中发布

标签 c# azure botframework microsoft-teams

我有一个使用 Microsoft Bot Framework 构建的机器人,在 Azure 应用服务中发布,我想将其发布到 Microsoft Teams channel 中以响应 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和 channel ID;据我所知,给定 Teams channel 的 channel 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()"
}

但是,如果我首先在 channel 中@提及机器人,则 POST 调用将返回 200 并且机器人会在 channel 中发帖。有没有办法将我的机器人配置为能够在 channel 中发帖而不被提及?

最佳答案

成功了,感谢 this answer 。在调用 CreateConversationAsync() 之前,将以下代码添加到 CreateChannelConversation() 中:

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

关于c# - Bot Framework 机器人无法在没有提示的情况下在 Microsoft Teams channel 中发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43684212/

相关文章:

c# - 如何找到字符串中的最后一个字母并获取其索引?

c# - 我可以在数据注释的错误消息中添加一个链接吗?

python - 从 SQL Server 代理运行代码时出现问题 - azure.storage.blob - 找不到模块 azure

azure - 如何以我的方式在 Windows Azure 上部署 Wordpress Multisite

c# - 如何将参数从 Controller 传递到 FormDialog 状态模型

c# - 禁用工具条菜单时如何使文本颜色保持黑色?

c# - 运行 CPU/内存密集型任务 - 哪种编码方法性能最高?

wordpress - 在 Windows Azure 上使用的最佳 CMS

node.js - 如何在 Microsoft Bot Framework 中处理获取请求?

node.js - docker桥接本地主机端口