在Azure上部署后ChatBot无法正常工作-内部服务器错误

时间:2019-03-27 00:29:20

标签: azure botframework luis

我已经与LUIS和QnA Maker部署了一个聊天机器人。当我在Emulator上运行时,它可以在本地完美运行。它会在聊天开始时加载自适应卡,而我从LUIS得到正确的答复。

但是,当我将漫游器部署到Azure并在网络聊天中对其进行测试时,会出现以下错误:

  

发送此消息到您的机器人时出错:HTTP状态代码InternalServerError

这是我的web.config的样子:

 <configuration>
  <appSettings>
    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->
    <add key="BotId" value="BotLuis" />
    <add key="MicrosoftAppId" value="9f9564ef-d627-450f-b943-98b7338c0f31" />
    <add key="MicrosoftAppPassword" value="myapp-password" />
  </appSettings>

我从我在Azure上创建的Web bot的“应用程序”设置中获取AppID和AppPassword的值。我知道它们是正确的,因为我使用这些值在本地使用Emulator进行设置。

我将代码从github部署到Azure。我的机器人在azure网络聊天中加载得很好(自适应卡片显示),但是在此之后,无论我是输入交互式卡片还是聊天命令,我都给它输入了任何错误,但出现了以上错误。

应用程序Insight显示以下异常:

  

POST到BotLuis失败:POST到机器人的端点失败,HTTP状态为500   问题ID:Microsoft.Bot.ChannelConnector.BotAPI + d__31.MoveNext上的System.Exception

当我与机器人互动时,开发人员工具控制台会显示以下内容:

https://webchat.botframework.com/v3/directline/conversations/3NgflndFbpzCRDtnMdZpjf-g/activities 502 (Bad Gateway)

如果将上面的链接粘贴到浏览器中,将得到以下信息:

{
 "error": {
 "code": "BadArgument",
 "message": "Missing token or secret"
        }
}

我现在迷路了。我可以理解问题,但不知道如何前进。我应该在代码中的某个地方添加我的机器人的消息传递终结点吗?

指向github代码仓库的链接:here

1 个答案:

答案 0 :(得分:1)

Bot State Service retired于2018年3月31日发布。 因此,当您在Azure上运行示例时,示例将缺少状态存储,而该示例将在本地运行。

要使您的示例生效,只需将以下行添加到Global.asax.cs文件中。

protected void Application_Start()
{
    RegisterBotDependencies();

    GlobalConfiguration.Configure(WebApiConfig.Register);

    var store = new InMemoryDataStore();

    Conversation.UpdateContainer(
               builder =>
               {
                   builder.Register(c => store)
                             .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
                             .AsSelf()
                             .SingleInstance();

                   builder.Register(c => new CachingBotDataStore(store,
                              CachingBotDataStoreConsistencyPolicy
                              .ETagBasedConsistency))
                              .As<IBotDataStore<BotData>>()
                              .AsSelf()
                              .InstancePerLifetimeScope();


               });
}

请注意,此示例使用InMemory存储,因此不适用于生产。在博客文章之后,您可以轻松切换到Azure Table存储或CosmosDB。

我已经克隆了您的存储库,添加了以下代码行并将其部署到Azure上的新机器人实例中。网络聊天测试成功。

摘要

来自上述博客文章。

  

一段时间以来,我们一直在鼓励使用Bot Framework的机器人开发人员使用他们自己的自定义状态服务。默认的Bot Framework State服务仅用于原型设计目的,并不旨在容纳生产机器人。国家服务将于2018年3月31日弃用,将不再受支持。前进的Bot开发人员将能够使用本文所述的临时本地内存存储来对其机器人进行原型制作。为您的机器人创建自己的自定义状态服务可带来多种好处,包括改进的延迟以及对机器人的对话状态和上下文用户对话状态信息的直接控制,并且我们提供了多种资源来指导您这样做。我们感谢机器人开发者社区提供的反馈,这些反馈对我们整体上改进Bot Framework起到了很大的帮助作用。我们也希望我们能继续为您(机器人开发者社区)提供帮助,为您的用户创造越来越好的机器人体验。