gpt4 book ai didi

ajax - 为什么使用 wsHttpBinding 时 InstanceContextMode.PerSession 的行为类似于 PerCall?

转载 作者:行者123 更新时间:2023-12-04 08:36:25 26 4
gpt4 key购买 nike

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

网络配置:

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

<wsHttpBinding>
<binding name="wsHttpBin">
<security mode="None"/>
</binding>
</wsHttpBinding>

据我所知 read , 我必须使用 <security mode="None"/>因为使用“wsHttpBinding”绑定(bind)公开的服务实现了 WS-* 系列 Web 服务规范的 WS-Security。由于绑定(bind)使用安全性,因此请求将被拒绝,因为 AJAX 不支持安全上下文。

我的 WCF 服务行为是用 InstanceContextMode.PerSession 定义的:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
InstanceContextMode = InstanceContextMode.PerSession)]

但是当我使用它时,服务表现为 PerCall 并且每次调用都会启动一个新的 WCF 实例,而不是使用当前实例。

为什么使用 wsHttpBinding 时 InstanceContextMode.PerSession 的行为类似于 PerCall?

我能做些什么?

最佳答案

通过 HTTP 使用的 session 仅在使用安全 session 或可靠 session 时受 WCF 支持。如果你不能使用,那么你必须自己实现一个 session 机制。如果您同时控制客户端和服务器端,那将很容易做到。就是这样:

创建一个包含您需要存储的所有 session 数据的类(我们称之为 SessionData ),以及一个额外的 DateTime上次使用 session 的时间。然后将 static 添加到您的服务类(或任何其他类) ConcurrentDictionary<string, SessionData> .

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

就是这样——你已经自己实现了 session 。您现在可以使用 InstanceContextMode.Single并且不用担心 WCF 在每个 session 中正确创建服务类的实例。

编辑 :如果您正在使用 .NET 4.5 编写 WCF 服务并且您的 Web 应用程序只针对现代浏览器,您可以使用 NetHttpBinding在服务器端,WebSocket 在客户端。 NetHttpBinding支持 session (指定 SessionMode.Required 时)。

关于ajax - 为什么使用 wsHttpBinding 时 InstanceContextMode.PerSession 的行为类似于 PerCall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com