Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Ajax 为什么InstanceContextMode.PerSession在使用wsHttpBinding时表现得像PerCall?_Ajax_Wcf_Soap_Wshttpbinding_Wcf Sessions - Fatal编程技术网

Ajax 为什么InstanceContextMode.PerSession在使用wsHttpBinding时表现得像PerCall?

Ajax 为什么InstanceContextMode.PerSession在使用wsHttpBinding时表现得像PerCall?,ajax,wcf,soap,wshttpbinding,wcf-sessions,Ajax,Wcf,Soap,Wshttpbinding,Wcf Sessions,我有使用SOAP 1.2的AJAX客户端使用的WCF服务 Web.config: <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1" bindingConfiguration="wsHttpBin"> <wsHttpBinding> <binding name="wsHttpBin"> <security mode="None"/>

我有使用SOAP 1.2的AJAX客户端使用的WCF服务

Web.config:

<endpoint address="" binding="wsHttpBinding" 
contract="WcfService1.IService1" bindingConfiguration="wsHttpBin">

<wsHttpBinding>
  <binding name="wsHttpBin">
    <security mode="None"/>          
  </binding>
</wsHttpBinding>
但是当我使用它时,服务的行为就像PerCall一样,每次调用都会启动一个新的WCF实例,而不是使用当前实例

为什么InstanceContextMode.PerSession在使用wsHttpBinding时表现得像PerCall


我能做什么?

当通过HTTP使用会话时,只有在使用安全会话或可靠会话时,WCF才支持会话。如果两种方法都不能使用,那么必须自己实现会话机制。如果您同时控制客户端和服务器端,这将非常容易做到。以下是方法:

创建一个类,该类保存您需要存储的所有会话数据(我们称之为
SessionData
),并为会话上次使用的时间添加一个
DateTime
。然后向您的服务类(或任何其他类)添加一个
static
ConcurrentDictionary

当客户端调用您的服务时,要求它传递标识会话的唯一字符串(可以在客户端随机生成)。每当客户端调用您的服务时,在字典中查找会话字符串并检索会话数据(并根据需要更新其内容)。如果不存在,请在字典中创建一个新条目。此外,每次访问
SessionData
对象时,都要将“上次使用的”
DateTime
更新为当前时间。后台任务应定期清除一段时间未使用的旧会话

就这样-您已经自己实现了会话。您现在可以使用
InstanceContextMode.Single
,而不用担心WCF会在每个会话中正确创建服务类的实例

编辑:如果您正在使用.NET 4.5编写WCF服务,并且您的web应用程序仅面向现代浏览器,那么您可以在服务器端使用
NetHttpBinding
,在客户端使用WebSocket
NetHttpBinding
支持会话(当指定
SessionMode.Required
时)。

这提供了您需要了解的几乎所有信息(当然是一般情况)

但准确地说。Msdn谈到WCF会议:

它们由调用方显式启动和终止 应用

我必须说,我不知道有任何JS代码/框架允许您存储显式打开的WCF通信通道以保持“会话”活动。(你还没有提供你的客户代码,所以我必须做一些假设)。 WCF会话不是“基于cookie的”。它不像ASP.NET web应用程序那样在浏览器中“开箱即用”


设置InstanceContextMode.PerSession使您的WCF服务“会话就绪”,但这还不足以“强制”会话。

可能重复:@ErnieL谢谢,但使用不是我的选项,因为它不能与我的AJAX客户端一起工作。wsHttpBinding本身不支持会话。@ErnieL那么我该怎么做才能从AJAX使用Wcf并使用会话?+1:不说你的建议一开始就有缺陷,但是,为了实现一个生产就绪会话机制,需要考虑一个完整的问题:如会话劫持(意外的或故意的),实际的会话超时对于应用程序来说是有意义的,会话(数据)持久性/恢复性,在服务器重新启动(计划或计划/崩溃)的情况下,通过多个并发请求等并发修改会话(数据)。@Christian.K:非常正确。我不相信最后两件事是由WCF提供的。安全性确实是一个需要考虑的问题,至于线程安全,我假设每个客户端都会生成一个唯一的会话密钥,并且在任何给定时间最多执行一次对服务的调用,但如果不是这样的话,线程的安全性和正确性也需要考虑。@AllonGuralnek没有使用InstanceContextMode。Single将对我的性能产生重大影响?@Dor:如果使用
ConcurrencyMode.Multiple
,则不会。您的服务应该只使用来自
SessionData
对象的数据,因为(如果您没有使用
Single
)任何实例字段都是每次调用的(因此它们也可能是本地变量/参数)。这就是为什么在您的情况下,
Single
是有意义的-一切都是本地的或在
SessionData
中,您的服务类的实例都是无意义的。那么为什么不使用InstanceContextMode.PerCall呢?这样我就可以使用静态变量,而且它的性能会更好,您认为呢?ASP.NET的“基于cookie”是什么意思?如果我要添加,那么我可以使用它吗?能给我一个“开箱即用”的解决方案吗。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
                 InstanceContextMode = InstanceContextMode.PerSession)]