我有一项需要会话的服务。原因是客户端启动会话,如果用户名和密码正确,服务查询到数据库,如果正确,则服务允许将服务用于此会话。
我已经读过在方法调用完成后代理将被关闭,以释放资源,但我有一个疑问。如果我在方法完成后关闭代理,会话也会关闭,所以当我调用另一个方法时,我必须再次查询数据库,以便在允许使用服务之前检查凭据是否正确。
那么,在客户端中的应用程序打开时保持打开会话并在客户端关闭应用程序时关闭代理不是更好吗?通过这种方式,我保持连接活动和会话,但每次调用方法时我都不必从数据库中获取凭据。
我检查凭据以允许或不允许会话使用该服务的方式可能是错误的。
感谢。
答案 0 :(得分:3)
如果您的目的是验证用户,您可以使用以下选项:
将客户端凭据设置为UserName。在这种情况下,在执行任何调用之前,客户端的用户名和密码将根据存储在数据库中的数据进行验证。您可以定义从 UsernamePasswordValidator 派生的自定义类,您可以在其中查询数据库,以确定是否允许调用者使用服务。我推荐你这个post。
我已经知道在方法调用之后代理将被关闭 完成
不是代理,但实例将被销毁,并且负责OperationBehavior的 ReleaseInstanceMode 属性。您不会受益于此类解决方案,因为销毁实例不会剥夺用户访问服务的权限。可以创建另一个实例。当然 ReleaseInstanceMode 适用于 InstanceContextMode 设置为PerSession时的情况。