DataSnap服务器引发"当前会话无权执行请求的操作"注册回调时

时间:2013-12-12 14:30:45

标签: delphi delphi-xe2 datasnap

当我尝试在连接/会话丢失后注册回调时,我收到此错误。

我仍然没有确切知道它何时发生,如果是在连接丢失之后,在服务器杀死会话之后或类似的东西之后,我试图以多种方式强制它但是无法准确地隔离它发生了。

调试Datasnap代码,我注意到它是由于安全令牌而引发的。

我的“猜测”是这种情况发生的方式:

  • 客户端失去连接
  • 服务器没有注意到断开连接,之前的会话仍处于活动状态
  • 客户端重新连接,尝试注册新回调
  • 在服务器上创建另一个会话
  • 使用与上一个会话相同的安全令牌注册回调
  • 服务器阻止它,因为此安全令牌已在另一个会话中使用

无论如何,我在客户端收到连接错误并且我尝试再次注册回调后得到这个。

我的客户端代码如下所示:

CallbackChannelManager.CloseClientChannel; // Do I need to call this?
CallbackChannelManager.RegisterCallback(TDSTunnelSession.GenerateSessionId, TMyCallback.Create);

关于回调的Datasnap文档非常糟糕,我甚至没有开始,但是,我的问题是:

  • 在连接/会话丢失后,我是否真的需要手动重新注册所有回调?
  • 如果是这样,这样做的正确方法是什么?
  • 我是否必须为每个连接实例化一个新的CallbackChannelManager,以便获得新的安全令牌? (这是基于我猜测为什么会发生这种情况)

感谢。

1 个答案:

答案 0 :(得分:1)

问题是由于我使用相同的 CallbackChannelManager.ManagerId 来重新注册回调。

在重新注册回调之前我开始生成一个新的ManagerId并且错误停止了,所以现在我的代码看起来像:

CallbackChannelManager.CloseClientChannel;
CallbackChannelManager.ManagerId := TDSTunnelSession.GenerateSessionId;
CallbackChannelManager.RegisterCallback(TDSTunnelSession.GenerateSessionId, TMyCallback.Create);