通过使用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?
我能做什么?
会话,通过HTTP使用时,只能通过WCF使用安全会话或可靠的会话时的支持。 如果你不能使用任何那么你必须自己实现一个会话机制。 如果你控制客户端和服务器端,这将是很容易做到这一点。 这是如何做:
创建保存你需要存储的所有会话的数据的类(我们称之为SessionData
),加上一个额外的DateTime
为当届最后一次使用。 然后添加到您的服务类(或任何其他类)一个static
ConcurrentDictionary<string, SessionData>
当客户端调用你的服务,要求它通过识别会话(它可以在客户端随机生成)的唯一字符串。 每当客户端调用您服务,期待建立会话串在字典和检索会话数据(并根据需要更新其内容)。 如果它不存在,创建在字典中的新条目。 此外,每次访问时间SessionData
对象,更新了“最后一次使用” DateTime
为当前时间。 后台任务应该定期清除掉已经有一段时间没有使用了旧的会话。
这就是它 - 你实现了你自己的会话。 您现在可以使用InstanceContextMode.Single
而不用担心WCF正确创建每个会话服务类的实例。
编辑 :如果你使用.NET 4.5编写WCF服务,你的web应用程序只针对现代浏览器,你可以使用NetHttpBinding
上的客户端服务器端和网页套接字。 NetHttpBinding
支持会话(指定时SessionMode.Required
)。
此链接给你几乎所有你需要知道这(一般课程)。
但要精确。 MSDN说,大约WCF会议:
他们明确地启动或终止通过调用应用程序
我必须说,我不知道任何JS代码/框架,允许你存储明确打开WCF的通信信道,以保持你的“会话”活着。 (您没有提供您的客户端代码,所以我必须作出一些假设)。 WCF会话不是“基于Cookie”。 它并不像它会为ASP.NET Web应用程序的工作“开箱即用”,从您的浏览器。
设置InstanceContextMode.PerSession
让你的WCF服务“会议准备”,但它是不够的,“力”的会话。
文章来源: Why InstanceContextMode.PerSession behave like PerCall when using wsHttpBinding?