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