一段时间后,Skype Channel主动消息请求获取500(内部服务器错误)



我正在为Skype Channel开发一个可以发送主动消息的机器人。

我遵循示例项目https://github.com/microsoft/botbuilder-samples/tree/master/master/samples/csharp_dotnetcore/16.proactive-messages,这适合我的需要。

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

我在Azure通道注册中注册了我的机器人,并在Skype上进行了测试。bot对我做出回应,当我发送请求以主动端点时,我会收到主动的消息。一切都很好。

然后,我意识到,一段时间后,主动请求获得500(内部服务器错误(。之后,我从Skype键入了一些内容,然后再次发送主动请求,Bot发送了主动消息。

我调查了这个问题,并找到了两件事。首先,在IIS中启用EswardOn,但我正在共享托管中,我做不到。其次,定期将一些请求发送到机器人以保持机器人的活力。

比我注意到的,我可以使用Directline频道进行此操作。我设置代码开始对话,发送一些消息并在发送主动通知之前接收消息。我很容易从Directline开始对话,我发送了一条消息,然后收到了答复。由于这是对机器人的请求,因此我认为这可以通过主动来解决我的500(内部服务器错误(响应状态。但事实并非如此。

我只能在Skype中接收主动的消息,只有在短时间内我键入Skype的某些内容以便从Skype进行机器人。否则,Skype主动消息请求获取500错误。

我不知道如何完成此操作。

请注意,我也在其重复的GitHub问题中与该用户合作。

这听起来可能是一个TrustServiceUrl问题(尽管有500 vs 401错误消息(。

您可以通过将Skype添加到可信URL的列表中来解决它:

var serviceUrl = <GetThisFrom Activity.ServiceUrl>;
MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);

如果有帮助,这是指向库的链接。否则,浏览这些问题应该会有所帮助。

对他人的注意:

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

这是方法定义。注意:您也可以为此添加到期。

我已经为此提交了PR,到目前为止,这导致了一些更新的文档

最新更新