Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何启动WCF合同?_C#_Wcf_Session_Communication_Principal - Fatal编程技术网

C# 如何启动WCF合同?

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; 这可能

通过阅读,我认为客户机不能在执行IsInitiating=true服务方法之前运行IsInitiating=false服务方法。但是在我们的WCF服务中,这是一个单一的服务,我可以随意调用服务方法,没有必要先调用IsInitiating=true服务方法?这到底是怎么回事

我正在使用IAuthorizationPolicy Evaluate,在这里我设置了这样一个临时上下文

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在我的解决方案中不起作用的原因。谢谢