如何让Skype通话在Azure Functions机器人中正常工作?
Azure Functions机器人处理Skype通话问题排查与解决
首先明确:Azure Functions机器人完全可以处理Skype通话,下面针对你遇到的问题一步步分析解决:
一、已解决的回调URL无效问题
你之前在local.settings.json配置Microsoft.Bot.Builder.Calling.CallbackUrl未生效,是因为Azure Functions的生产环境配置需要在Azure门户的**应用设置(Application settings)**中添加对应键值对,本地配置文件仅适用于本地调试。你已经完成这一步并消除了日志错误,接下来聚焦第二个问题。
二、Skype仍返回默认提示语的解决要点
这个提示说明你的通话处理逻辑未正确触发,或者没有返回有效的自定义响应,结合你参考的CallingBot示例,迁移到Azure Functions时需要注意以下关键细节:
1. 确保Function的HTTP触发器配置正确
- 你的通话处理Function必须是HTTP触发器,且需设置为允许匿名访问(Skype的通话回调请求是匿名发起的)。
- 确认Function的公网可访问URL正确,格式为:
https://<你的函数应用名称>.azurewebsites.net/api/<你的函数名称>,这个URL就是要配置的回调URL。
2. 手动初始化CallingBotService(避免依赖注入问题)
Azure Functions的依赖注入机制与普通Web项目不同,不能依赖Autofac自动注册,需要手动初始化服务:
// 在Function代码中获取应用设置里的配置 var appId = Environment.GetEnvironmentVariable("MicrosoftAppId"); var appPassword = Environment.GetEnvironmentVariable("MicrosoftAppPassword"); var callbackUrl = Environment.GetEnvironmentVariable("Microsoft.Bot.Builder.Calling.CallbackUrl"); // 创建配置实例 var settings = new CallingBotServiceSettings { MicrosoftAppId = appId, MicrosoftAppPassword = appPassword, CallbackUrl = new Uri(callbackUrl) }; // 初始化CallingBotService并传入你的自定义ICallingBot实现 var callingBotService = new CallingBotService(settings, new YourCustomCallingBot());
3. 确保自定义ICallingBot实现正确处理通话事件
你的ICallingBot子类必须重写OnIncomingCallReceived方法,返回自定义的通话响应,不要让流程走到默认逻辑。示例代码如下:
public class YourCustomCallingBot : ICallingBot { public async Task OnIncomingCallReceived(IncomingCallEvent incomingCallEvent) { // 创建自定义通话响应 var playPrompt = new PlayPrompt { OperationId = Guid.NewGuid().ToString(), Prompts = new List<Prompt> { new Prompt { Value = "你好!这是你的Azure Functions通话机器人,测试通话正常。" } }, Actions = new List<ActionBase> { new Hangup { OperationId = Guid.NewGuid().ToString() } } }; // 将响应添加到工作流 await incomingCallEvent.ResultingWorkflow.Actions.Add(playPrompt); } // 按需实现其他ICallingBot接口方法 public Task OnPlayPromptCompleted(PlayPromptCompletedEvent playPromptCompletedEvent) => Task.CompletedTask; public Task OnRecordCompleted(RecordCompletedEvent recordCompletedEvent) => Task.CompletedTask; public Task OnHangupCompleted(HangupCompletedEvent hangupCompletedEvent) => Task.CompletedTask; // ...其他方法 }
4. 验证Skype机器人的通话配置
在Azure门户的机器人资源中,进入通话选项卡:
- 确认已启用通话能力
- 回调URL已设置为你的Function公网URL
- 机器人的Microsoft App ID和密码与你Function中使用的完全一致
总结
按照上述步骤检查后,你的机器人应该能正确响应Skype通话,替换掉默认的提示语。你在BotBuilder仓库提交的问题也可以同步关注,不过优先排查这些配置和代码逻辑问题,大概率能解决当前问题。
内容的提问来源于stack exchange,提问作者Rufus1123
相关产品推荐
相关产品推荐

