为什么InstanceContextMode.PerSession使用的wsHttpBinding时

2019-08-03 15:04发布

通过使用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>

从我读 ,我必须使用<security mode="None"/>因为有“的wsHttpBinding”结合实现了WS-安全的WS-暴露的服务*系列的Web服务规范。 由于绑定使用安全,请求将被拒绝,因为AJAX不支持安全上下文。

我的WCF服务行为的定义与InstanceContextMode.PerSession

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
                 InstanceContextMode = InstanceContextMode.PerSession)]

但是当我使用它的服务表现为PerCall和每次通话开始的,而不是使用当前实例的新WCF实例。

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

我能做什么?

Answer 1:

会话,通过HTTP使用时,只能通过WCF使用安全会话或可靠的会话时的支持。 如果你不能使用任何那么你必须自己实现一个会话机制。 如果你控制客户端和服务器端,这将是很容易做到这一点。 这是如何做:

创建保存你需要存储的所有会话的数据的类(我们称之为SessionData ),加上一个额外的DateTime为当届最后一次使用。 然后添加到您的服务类(或任何其他类)一个static ConcurrentDictionary<string, SessionData>

当客户端调用你的服务,要求它通过识别会话(它可以在客户端随机生成)的唯一字符串。 每当客户端调用您服务,期待建立会话串在字典和检索会话数据(并根据需要更新其内容)。 如果它不存在,创建在字典中的新条目。 此外,每次访问时间SessionData对象,更新了“最后一次使用” DateTime为当前时间。 后台任务应该定期清除掉已经有一段时间没有使用了旧的会话。

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

编辑 :如果你使用.NET 4.5编写WCF服务,你的web应用程序只针对现代浏览器,你可以使用NetHttpBinding上的客户端服务器端和网页套接字。 NetHttpBinding支持会话(指定时SessionMode.Required )。



Answer 2:

此链接给你几乎所有你需要知道这(一般课程)。

但要精确。 MSDN说,大约WCF会议:

他们明确地启动或终止通过调用应用程序

我必须说,我不知道任何JS代码/框架,允许你存储明确打开WCF的通信信道,以保持你的“会话”活着。 (您没有提供您的客户端代码,所以我必须作出一些假设)。 WCF会话不是“基于Cookie”。 它并不像它会为ASP.NET Web应用程序的工作“开箱即用”,从您的浏览器。

设置InstanceContextMode.PerSession让你的WCF服务“会议准备”,但它是不够的,“力”的会话。



文章来源: Why InstanceContextMode.PerSession behave like PerCall when using wsHttpBinding?