【问题标题】:Adding middleware to bot framework将中间件添加到机器人框架
【发布时间】:2020-11-09 09:19:45
【问题描述】:

我正在尝试将中间件添加到 echo bot 中,将消息转换为小写。

我创建了继承自 IMiddleware 的中间件类

public class MiddlewareOne : IMiddleware
    {
        public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
        {
            if(turnContext.Activity.Type == ActivityTypes.Message)
            {
                Debug.WriteLine(turnContext.Activity.Text);

                turnContext.Activity.Text = turnContext.Activity.Text.ToLower();
                await next(cancellationToken);

                Debug.WriteLine(turnContext.Activity.Text);
            }
            else
            {
                await next(cancellationToken);
            }
        }
    }
}

现在我正在尝试将其添加到 Startup.cs 文件中。我在某处发现它应该被添加为瞬态。

services.AddTransient<MiddlewareOne>();

仍然无法正常工作。我觉得 MiddlewareOne 类是可以的,但是在 Startup.cs 文件中应该如何配置呢?

谢谢

【问题讨论】:

  • 我发现适配器通过 Use() 只支持 2 个中间件。如果您尝试 Use() 第三个中间件,它会被忽略。您是否注意到这一点或知道向管道添加超过 2 个中间件的解决方案?

标签: c# botframework middleware


【解决方案1】:

您必须通过调用Use method in constructor 在您的 BotFrameworkAdapter 后代(例如 BotFrameworkHttpAdapter)中注册中间件。您可以将中间件作为构造函数参数传递,DI 将负责激活。

一个例子(在没有 VS 帮助的情况下制作)

public class MyAdapter : BotFrameworkHttpAdapter
{
    public MyAdapter(MiddlewareOne mw1, IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger)
        : base(configuration, logger)
    {
        Use(mw1);
        // other code..
    }
}

【讨论】:

  • 我发现适配器通过 Use() 只支持 2 个中间件。如果您尝试 Use() 第三个中间件,它会被忽略。您是否注意到这一点或知道向管道添加超过 2 个中间件的解决方案?
  • 你确定第二个中间件调用OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = new CancellationToken())方法实现中的下一个委托吗?
  • 谢谢。你是对的,我仔细检查了一个中间件类,它有一个条件是跳过调用 next(),这导致了问题。感谢您的快速回复和帮助。
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 2021-08-04
  • 2015-10-14
  • 2022-10-20
  • 2022-01-27
  • 2020-04-16
  • 2019-05-10
  • 2021-09-01
相关资源
最近更新 更多