Bot Framework Composer自定义错误消息与异常处理实现咨询
Bot Framework Composer自定义异常与错误消息实现方案
方案一:修复自定义Adapter的注册与逻辑
你继承CloudAdapter的思路本身可行,大概率是依赖注入或初始化环节出了问题,可按以下步骤调整:
修正构造函数参数匹配
自定义运行时中,BotFrameworkAuthentication通常使用ConfigurationBotFrameworkAuthentication类型,显式指定后可避免依赖注入匹配错误:public class AdapterWithErrorHandler : CloudAdapter { public AdapterWithErrorHandler(ConfigurationBotFrameworkAuthentication auth, ILogger<CloudAdapter> logger, ConversationState conversationState = default) : base(auth, logger) { OnTurnError = async (turnContext, exception) => { // 记录异常日志 logger.LogError(exception, $"[OnTurnError] 未处理错误: {exception.Message}"); // 发送自定义错误消息给用户 var errorMsg = MessageFactory.Text("抱歉,机器人遇到了一点小问题,请稍后再试~", null, InputHints.IgnoringInput); await turnContext.SendActivityAsync(errorMsg); if (conversationState != null) { try { // 删除当前对话状态,避免陷入错误循环 await conversationState.DeleteAsync(turnContext); } catch (Exception e) { logger.LogError(e, "删除对话状态时出错: {e.Message}"); } } // 发送追踪活动到模拟器 await turnContext.TraceActivityAsync("OnTurnError 追踪", exception.Message, "https://www.botframework.com/schemas/error", "TurnError"); }; } }确保服务注册完整
在Startup.cs的ConfigureServices方法中,先确认对话状态已注册,再替换默认适配器:// 注册对话状态(未注册时添加) services.AddSingleton<ConversationState>(sp => { var storage = sp.GetRequiredService<IStorage>(); return new ConversationState(storage); }); // 注册自定义Adapter services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();
方案二:添加自定义异常处理中间件
如果Adapter方式仍不生效,可通过Bot Framework的中间件管道全局捕获异常:
创建异常处理中间件
public class ExceptionHandlerMiddleware : IMiddleware { private readonly ILogger<ExceptionHandlerMiddleware> _logger; private readonly ConversationState _conversationState; public ExceptionHandlerMiddleware(ILogger<ExceptionHandlerMiddleware> logger, ConversationState conversationState) { _logger = logger; _conversationState = conversationState; } public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default) { try { await next(cancellationToken); } catch (Exception ex) { _logger.LogError(ex, "中间件捕获未处理异常: {ex.Message}"); // 发送自定义错误消息 var errorMsg = MessageFactory.Text("哎呀,出问题了,请稍候再尝试哦~", null, InputHints.IgnoringInput); await turnContext.SendActivityAsync(errorMsg, cancellationToken); try { // 重置对话状态 await _conversationState.DeleteAsync(turnContext, cancellationToken); } catch (Exception e) { _logger.LogError(e, "重置对话状态失败: {e.Message}"); } } } }注册中间件到管道
在Startup.cs中完成中间件的注册与挂载:services.AddSingleton<ExceptionHandlerMiddleware>(); // 在Configure方法中(基于WebApplication模式) app.UseBotFramework(); var botAdapter = app.Services.GetRequiredService<IBotFrameworkHttpAdapter>(); if (botAdapter is CloudAdapter adapter) { adapter.Use(app.Services.GetRequiredService<ExceptionHandlerMiddleware>()); }
方案三:利用Composer内置配置(无需代码修改)
如果不需要复杂的异常处理逻辑,可直接在Composer中配置全局错误消息:
- 打开Composer进入项目,点击Settings -> Runtime Settings
- 找到Error Messages配置项,直接设置自定义的错误提示文本即可
内容的提问来源于stack exchange,提问作者dattatrey
相关产品推荐
相关产品推荐

