我可以在 datasnap 服务器和客户端之间使用“回调”作为示例 here作者:帕维尔·格洛瓦茨基 但是,当我通过简单例份验证在服务器表单上添加 DSAuthenticationManager1 时,我无法在客户端注册回调。
我收到此错误:“异常类 TDBXError,带有消息“远程错误:身份验证管理器拒绝了用户凭据。这可能是由于 DS 用户名和密码的组合无效”。”
我在客户端向 SQLConnection 添加了登录详细信息,如下所示:
SQLConnection1.Params.Values['DSAuthenticationUser'] := Username;
SQLConnection1.Params.Values['DSAuthenticationPassword'] := Password;
所以我的 SQLConnection1 成功连接到服务器。但我找不到 DSAuthenticationManager1 的任何方法。
如何将登录参数导入 DSAuthenticationManager1?
最佳答案
Delphi-XE 中的 TDSClientCallbackChannelManager
组件不包含与 Delphi-XE2 中相同的属性。当我将此组件添加到我的项目 (XE2) 时,我有 Username
和 Password
属性,这些属性将传递到 DataSnap 服务器的 DSAuthenticationManager.OnUserAuthenticate
每当调用 RegisterCallback()
或 UnregisterCallback()
时都会调用该方法。
您有最新的 XE 更新吗?如果最新更新中没有用户名和密码,则您可能需要升级到 XE2 才能在 DataSnap 服务器中使用 TDSAuthenticationManager
和在客户端中使用 TDSClientCallbackChannelManager
。
我认为也许您可以从 TSDClientCallbackChannelManager
创建您自己的类,并重写将用户名和密码添加到 DBXConnection 的方法 - 从而为您提供了一种自行添加它们的方法。我尝试了这个,但是需要重写的方法不是虚拟的。我想也许我可以通过将新类中同名的方法提升为 public
来隐藏祖先方法,而它们在祖先类中是 protected
。它生成代码并将其链接到我的客户端应用程序(通过新代码行旁边的蓝点可以明显看出),但它不会在运行时调用我的代码。它始终调用祖先方法(DBXConnectionProperties
和 ExecuteRemote
)。
我认为您唯一的解决方案是更新到 XE2,或者不使用服务器上的身份验证管理器。
关于delphi - 带身份验证的 DataSnap 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919941/