首页 > 解决方案 > 不使用 Web API 的主动通知

问题描述

我在 GitHub 上查看 Proactive Notification 示例,发现使用了一个 api 控制器来发送通知。

我不喜欢它的是它打开了一个我不需要的浏览器选项卡/窗口。

我也不需要调用任何 api,我更愿意调用一个方法来实现同样的事情。所以我从示例中构建了一个类似的控制器,但不是一个 api 控制器:

public class NotifyController
    {
        private readonly IBotFrameworkHttpAdapter _adapter;
        private readonly string _appId;
        private readonly ConcurrentDictionary<string, ConversationReference> _conversationReferences;
        private readonly GretaDBContext DBContext;

        public NotifyController(IBotFrameworkHttpAdapter adapter, ConcurrentDictionary<string,ConversationReference> references,
            GretaDBContext dbContext, IConfiguration configuration)
        {
            _adapter = adapter;
            _conversationReferences = references;
            DBContext = dbContext;
            _appId = configuration["MicrosoftAppId"];

            if (string.IsNullOrEmpty(_appId))
            {
                _appId = Guid.NewGuid().ToString(); //if no AppId, use a random Guid
            }
        }

        public async Task NotifyValidation(int id)
        {
            foreach(var conversationReference in _conversationReferences.Values)
            {
                //METHOD LOGIC FOR SENDING PROACTIVE NOTIFICATION
            }
        }
    }

我的意图是将其注入到我的对话框中并调用其中一个公共函数,以通知一些用户他们的个人资料已经过验证。

我有几个问题:

  1. 像示例那样使用api并避免以某种方式打开浏览器会更好吗?还是将此控制器注入对话框也是一个好的解决方案?

  2. 如果答案是注入非 api 控制器,我是否将其声明为作用域、单例或瞬态服务?

标签: c#asp.net-mvcasp.net-coredependency-injectionbotframework

解决方案


肯定有另一种方法可以做到这一点 - 您可以在单独的应用程序中创建一个 ConversationContext,例如,基于某种消息队列,并在该应用程序内发送主动消息。例如,我有一个 Azure 函数,它可以按照特定的时间表向特定用户发送主动消息。为此,您确实需要某些信息,特别是对话 id、serviceurl 等,您需要事先获取和存储这些信息。有多种方法可以获取此信息,但最简单的方法是您的机器人与相关用户之间存在对话。

我很乐意提供更多帮助,但请在此处阅读我关于此主题的其他答案,因为它可能是您需要的:以编程方式向 Microsoft Teams 中的机器人发送消息


推荐阅读