我正在编写一个WCF应用程序。当我改变事物然后再次运行服务调用时,我会多次启动和停止它。
由于我需要会话信息,因此我使用wsHttpBinding
。
在我搬到wsHttpBinding
之前,我正在使用basicHttpBinding
,我可以停止服务,进行更改并重新启动它。然后我可以针对端点运行我的WCF测试客户端(WCF Storm),它仍然可以正常运行。
现在它告诉我:
无法处理邮件。这很可能是因为操作“http://tempuri.org/IMyService/MyOperation”不正确或因为邮件包含无效或过期的安全上下文令牌,或者因为绑定之间存在不匹配。如果服务因不活动而中止通道,则安全上下文令牌将无效。要防止服务中止空闲会话,请过早增加服务端点绑定的接收超时。
这意味着我必须刷新我的连接并重新设置我的服务电话(几百次后会变得烦人。)。
我读到安全超时是10分钟。我在不到2分钟内重新开始跑步,所以我不认为这是一个超时问题。
我的猜测是令牌过期的原因很明显,我已经杀死并重启了服务。
问题是我根本不需要安全性的东西(我只需要会话内容或者我会使用BasicHttpBinding
有没有让我的WCF服务不关心安全上下文令牌?
注意:我的测试客户端默认使用wsHttpBinding并具有安全设置。但我认为它是设置这个,因为我的服务是发布它需要安全性。
我尝试过的事情:
我尝试过类似于Here
的配置<bindings>
<wsHttpBinding>
<binding name="WsEventLogBinding">
<security mode="Message">
<message establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
</bindings>
但我真的不知道这意味着什么,或者它是否是我需要的东西(根本没有安全性(现在))。
这并没有消除这个问题。
<security mode="None">
这没有帮助。答案 0 :(得分:11)
首先,你是真的:由于HTTP协议的无连接/无状态特性,basicHttpBinding不支持这一点。
但我认为您的WCF理解存在问题。
Session是WCF中的通用概念。它可以是基于安全性的会话,其中通信的两端已经就特定的安全会话或可信会话达成一致,其中可以将消息配置为按顺序传递并且恰好一次,即使消息在对话期间跨多个节点传播,也能确保收到消息。
两种模式都允许您选择InstanceContextMode.PerSession。这真的是你想要的吗?
WCF安全依赖于相互身份验证;如果双方都信任对方的凭证(基于声明),则可以建立安全上下文,其中所有消息在机密性中交换,并且所有消息都被签名以保护其完整性。安全会话是唯一,您无法在其他会话中重复使用它。
以下是您的上下文存在的问题:问题不在服务器端上,而是在客户端上。因为必须在客户端和服务上保留某些内容,重建服务将刷新服务上的整个WCF上下文(所有实例和会话都将被释放)。没有与WCF会话关联的通用数据存储(与asp的一个区别) .net session),所以重启会掉落一切。但是,客户端仍然认为由于其“无效”上下文而被认证。
要解决此问题,默认Wcf测试客户端上有此方案的复选框:“启动新代理”。在WCf Storm中,在引擎盖/杂项“总是创建新代理”中有一个通用配置。
注意:在制作时,您永远不会有这种情况,因为您的服务将始终处于启动状态。
如果你关注我,你可能想尝试可靠的Session。你可以测试,但我不确定这是否有效。
<wsHttpBinding>
<binding name="wsHttpBindingConfiguration">
<security mode="None" />
<reliableSession enabled="true" />
</binding>
</wsHttpBinding>
重要提示:我不知道您的WCF级别,但在WCF中,客户端和服务必须具有同步配置(相同的安全性,会话设置......)
答案 1 :(得分:4)
wsHttpBinding具有安全性enabled by default。 尝试在绑定配置上使用此功能来禁用安全性:
<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>
另外,你的错误是wsHttpBinding相关。如果您使用会话并重新启动服务器,请reported security error message will appear。
根据MSDN:
可靠的会话实现WS-ReliableMessaging协议和 内存中传输窗口,用于屏蔽SOAP消息级别的故障和 在运输失败的情况下重新建立连接。
和
可靠会话在发送方和接收方SOAP之间 端点,无论所需的传输连接数量 他们之间的连接。简而言之,TCP可靠性在哪里结束 传输连接结束,而可靠的会话提供 端到端的可靠性。
听起来像预期的行为。
答案 2 :(得分:0)
您可以使用基本的http绑定TransportCredentialOnly security mode
答案 3 :(得分:0)
安全模式无人应该完成这项任务。
<bindings>
<wsHttpBinding>
<binding name="WsEventLogBinding">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
不要忘记在您的终端上应用bindingConfiguration="WsEventLogBinding"
。