加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajax – 使用wsHttpBinding时为什么InstanceContextMode.PerSess

发布时间:2020-12-16 01:37:34 所属栏目:百科 来源:网络整理
导读:我使用SOAP 1.2使用 AJAX客户端消耗的WCF服务 Web.config文件: endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1" bindingConfiguration="wsHttpBin"wsHttpBinding binding name="wsHttpBin" security mode="None"/ /binding/
我使用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>

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

我的WCF服务行为是使用InstanceContextMode.PerSession定义的:

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

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

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

我能做什么?

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读