【问题标题】:ChatBot not working after Deploying on Azure - Internal server error在 Azure 上部署后 ChatBot 无法工作 - 内部服务器错误
【发布时间】:2019-03-27 00:29:20
【问题描述】:

我已经使用 LUIS 和 QnA Maker 部署了一个聊天机器人。当我在模拟器上运行它时,它可以在本地完美运行。它会在聊天开始时加载自适应卡片,我会从 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 机器人的应用程序设置中获取 AppID 和 AppPassword 的值。我知道它们是正确的,因为我使用这些值在本地使用 Emulator 进行设置。

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

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

POST 到 BotLuis 失败:POST 到 bot 的端点失败,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 repo链接:here

【问题讨论】:

  • 您是否检查过它在模拟器中(在本地主机中)是否正常工作?
  • 是的。我在我的问题中提到了它。只有在 azure 上部署后它才会停止工作
  • 你能发布更多你的 StackTrace 吗?

标签: azure botframework azure-language-understanding


【解决方案1】:

Bot State Service retired 2018 年 3 月 31 日。 因此,当您在 Azure 上运行示例时,它会丢失状态存储,而它将在本地工作。

要使您的示例工作,只需将以下行添加到您的 Global.asax.csfile。

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 表存储或 CosmosDB。

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

总结

取自上述博文。

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

【讨论】:

  • 我会检查的!你是如何部署的?我的意思是我正在考虑使用 SDK v3 创建一个新的机器人......然后在那个机器人上从 VS 发布它
  • 我已经使用 Web 发布直接从 Visual Studio 部署到机器人实例。如果您需要更多建议,请告诉我。
  • 我在行 builder => { builder.Register(c => store) .Keyed>(AzureModule.Key_DataStore) 处收到“名称 azuremodel 在当前上下文中不存在” .AsSelf() .SingleInstance();
  • 对不起,忘了说你必须添加 Microsoft.Bot.Builder.Azure nuget 包!使用最新的 3.x 版本!
  • 我给你发了一个 PR。 github.com/hshahbaz/ChatBotwithLuis/pull/1 请看一下。请注意,我删除了您的部分代码我不是 100% 确定您需要它,但我认为它包含用于容器注册的重叠配置,导致您的代码崩溃。本质上,您的代码中有多个问题。丢失的机器人状态只是一个。现在,当直接从这个分支部署到 azure 时,一切看起来都很好:imgur.com/a/GAPClI1。你介意接受我的回答吗?
猜你喜欢
  • 2021-12-02
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-11-23
  • 2018-05-17
  • 2022-11-11
  • 2020-09-15
相关资源
最近更新 更多