【问题标题】:WCF: better per call o per session in this sceneario?WCF:在这种情况下,每次通话或每次会话更好?
【发布时间】:2026-01-23 17:40:02
【问题描述】:

我想要一个双工服务,我想知道一个客户端是否正确输入了她的用户名和密码,因为我只想让用户使用服务的方法,如果用户之前发送了她的用户名和她的密码正确。

对于双工,对于这个post,我知道我可以在每次调用时使用双工服务,使用静态列表来存储调用之间的回调。但我怀疑如何使用 per call 方法进行用户控制。

我在考虑这种情况:

1.- 用户调用方法 login() 并发送用户名和密码。在这种情况下是正确的。

2.- 用户现在可以调用服务的其余方法。例如方法 1()。在这里我有一个问题。每次调用如何,在每个方法调用中创建一个新实例,但是,来自同一个客户端,每个回调有不同的代码还是相同的?如果相同,当客户端有不同的回调时,什么时候重启应用?

如果每次调用的回调都不一样,我怎么知道客户端之前是否发送了她的用户名和密码?我需要将日志和密码作为方法参数发送吗?

如果回调相同,是否可以知道客户端何时关闭连接以从我的静态列表中删除回调?也许这就是连接控制?

谢谢。

编辑:我做了一些探测,我看到回调,客户端的 ID,对于每次调用方法都是相同的,因此可以创建一个类来保存所需的信息,例如用户名,如果此用户在此回调中输入了登录名和密码...等。

【问题讨论】:

    标签: wcf instance


    【解决方案1】:

    如果您使用 PerCall,您仍然可以拥有SessionMode = SessionMode.Required。然后你可以简单地用IsInitiating = true 来装饰你的登录方法操作契约属性,它告诉 wcf 操作启动了一个会话。所有其他操作应设置为IsInitiating = false。如果客户端调用的方法在调用 login 之前没有启动会话,则会抛出异常。

     [ServiceContract(Namespace = "Services", SessionMode = SessionMode.Required, CallbackContract =          typeof(SVIMyCallback))]
    
     [OperationContract(Name = "login", IsInitiating = true)]
     [OperationContract(Name = "doSomething", IsInitiating = false)]
    

    【讨论】: