C# 如何启动WCF合同?
通过阅读,我认为客户机不能在执行IsInitiating=true服务方法之前运行IsInitiating=false服务方法。但是在我们的WCF服务中,这是一个单一的服务,我可以随意调用服务方法,没有必要先调用IsInitiating=true服务方法?这到底是怎么回事 我正在使用IAuthorizationPolicy Evaluate,在这里我设置了这样一个临时上下文C# 如何启动WCF合同?,c#,wcf,session,communication,principal,C#,Wcf,Session,Communication,Principal,通过阅读,我认为客户机不能在执行IsInitiating=true服务方法之前运行IsInitiating=false服务方法。但是在我们的WCF服务中,这是一个单一的服务,我可以随意调用服务方法,没有必要先调用IsInitiating=true服务方法?这到底是怎么回事 我正在使用IAuthorizationPolicy Evaluate,在这里我设置了这样一个临时上下文 evaluationContext.Properties["Principal"] = userContext; 这可能
evaluationContext.Properties["Principal"] = userContext;
这可能是问题所在吗
现在,我不必使用IsInitiating,而必须检查messageAction,如果它不是登录服务方法,则检查是否存在存储的上下文,否则抛出securityexception
编辑:
这是服务设置要使用的内容:
InstanceContextMode = InstanceContextMode.PerCall
oncurrencyMode = ConcurrencyMode.Multiple
SessionMode = SessionMode.Required
IsInitiating
和IsTerminating
用于InstanceContextMode.PerSession
,它界定了服务器上的每个会话状态何时需要在连续调用中保留,从而允许控制与每个会话相关联的服务实例的寿命。会话模式实例的好处是,状态可以保留在服务器上,而无需从数据库中重新水化状态,尽管这最终会限制可伸缩性,因为并发会话的数量是有限的(每个新会话创建并保留一个实例,直到终止,这会消耗内存)
如果所说的singleton是指具有InstanceContextMode.Single
实例化的WCF服务,那么WCF会话(以及IsInitiating/IsTerminating)将不适用,因为服务器上将为来自所有客户端的所有调用保留单一状态<代码>InstanceContextMode.Single(假定为ConcurrencyMode=ConcurrencyMode.Multiple
)应谨慎使用,因为线程安全将是一个问题,例如singleton可用于不可变缓存(例如静态数据服务)或无状态计算
很好地解释了实例模式、会话和并发之间的关系
编辑
为了使WCF会话在
发起
和终止呼叫之间保持状态
,您需要将InstanceContextMode
更改为InstanceContextMode。PerSession
,因为PerCall
将丢失呼叫之间的所有状态(每次调用后,实例对象都有资格被收集,而使用PerSession
实例将被保留,直到调用IsTerminating
方法为止)。您还需要采用支持会话的绑定
。这里有一个基于MSDN calculator服务的示例。使用InstanceContextMode时需要注意的另一件事是需要服务器关联(粘性会话)如果您是在农场/云环境中扩展的。谢谢,很抱歉没有提供信息,我使用的是InstanceContextMode:PerCall。因此,虽然没有真正的Singleton,但我确实有供所有上下文使用的静态缓存。我在MSDN文章中没有找到任何关于初始化的内容。要让会话的魔力发挥作用,您需要更改InstanceContextMode.PerCall
到PerSession
-这将在会话的整个生命周期内保持服务器上的实例。好的,我理解,但是我选择PerCall是因为它据说更具可扩展性。相反,我在服务上获得了一个缓存,它将存储上下文数据,并且每次调用完成时都会获取。因此我支持它这就是为什么iInitiating在我的解决方案中不起作用的原因。谢谢