Skype 频道主动消息请求在一段时间后收到 500(内部服务器错误)

Skype channel proactive message request get 500 (Internal Server Error) after some time

我正在为 Skype 频道开发一个机器人,它可以发送主动消息。

我遵循了示例项目 https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/16.proactive-messages ,这满足了我的需要。

我将我的机器人托管在共享托管服务上,而不是 Azure。

我在 Azure 频道注册中注册了我的机器人,并在 Skype 上进行了测试。 Bot 回复我,当我向主动端点发送请求时,我收到主动消息。一切都很好。

然后我意识到,过了一段时间,主动请求得到 500(内部服务器错误)。之后,我从skype输入了一些东西给bot,然后再次发送主动请求,bot发送了主动消息。

我调查了这个问题,发现了两件事。首先,在 IIS 中启用 AlwaysOn,但我在共享主机上,我不能那样做。其次,定期向机器人发送一些请求以保持机器人存活。

比我注意到的,我可以使用 DirectLine 通道来做到这一点。我设置我的代码以开始对话,发送一些消息,并在我发送主动通知之前接收它。从 DirectLine 开始对话很容易,我发送了一条消息,并收到了回复。由于这是对机器人的请求,我认为这可以主动解决我的 500(内部服务器错误)响应状态。但是没有。

我只能在 Skype 中收到主动消息,只有当我在短时间内从 Skype 键入一些内容到 bot 时。否则,Skype 主动消息请求会出现 500 错误。

我不知道该怎么做。

请注意,我也在 their duplicate GitHub issue 中与该用户合作。

这听起来可能是 TrustServiceUrl Issue(尽管有 500 vs 401 错误消息)。

您可以通过将 Skype 添加到受信任的 URL 列表来修复它:

var serviceUrl = <GetThisFrom Activity.ServiceUrl>;

MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

Here's a link to the library, if that helps. Otherwise, browsing these issues 应该有帮助。

其他人注意事项:

此 "Trust Service URL Issue" 不仅仅适用于 Skype。当尝试使用主动消息传递时,许多其他 URL 都会发生这种情况。只需将 serviceUrl 替换为适合您的用例的内容即可。是的,如果您使用多个渠道,您可以在使用 MicrosoftAppCredentials.TrustServiceUrl() 时通过多次调用来添加多个 URL。

这是the method definition。注意:您也可以为此添加过期时间。

I've submitted a PR for this, which so far has resulted in some updated docs