服务器上的WCF时间更改导致断开连接

服务器上的WCF时间更改导致断开连接,wcf,time,Wcf,Time,在更改服务器(承载WCF应用程序)上的时间时,我注意到所有客户端都将断开连接。我确实理解为什么会发生这种情况,他们会因为超时而断开连接,因为如果我们将时间设置为一小时后,设置为15秒超时的可靠会话将很长时间过期。但有趣的是,如果你将其设置为延迟任何时间,它都不会失去连接,但如果将其设置为提前15秒以上,则会导致问题 问题是,当服务器时间发生变化时,我们能否防止客户端断开连接,因为我发现这种行为非常奇怪,让所有客户端断开连接是一个真正的问题 我们需要调整服务器时间,因为它将失去同步,这不是我们可以

在更改服务器(承载WCF应用程序)上的时间时,我注意到所有客户端都将断开连接。我确实理解为什么会发生这种情况,他们会因为超时而断开连接,因为如果我们将时间设置为一小时后,设置为15秒超时的可靠会话将很长时间过期。但有趣的是,如果你将其设置为延迟任何时间,它都不会失去连接,但如果将其设置为提前15秒以上,则会导致问题

问题是,当服务器时间发生变化时,我们能否防止客户端断开连接,因为我发现这种行为非常奇怪,让所有客户端断开连接是一个真正的问题

我们需要调整服务器时间,因为它将失去同步,这不是我们可以经常做的事情,因为我们需要转到物理位置(即客户的位置)。服务器位于高度安全的区域,由于安全原因,它们无法访问(或任何)外部服务器,我们需要从外部无法访问整个网络。
安装我们自己的时间服务器通常也会遇到同样的问题,它会失去同步,而保持在可接受范围内的解决方案往往过于昂贵。

您可以设置绑定,使其不在SOAP中包含时间戳。为此使用自定义绑定

下面是一个项目的示例代码,我很好奇它是否有效!注意,这段代码还设置了SOAP版本1.1,您可能需要更改/删除它

private Binding CreateBindingSoap11_NoTimeStamp()
{
    BasicHttpBinding httpBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);

    BindingElementCollection elements = httpBinding.CreateBindingElements();
    elements.Find<SecurityBindingElement>().IncludeTimestamp = false;
    elements.Find<TextMessageEncodingBindingElement>().MessageVersion = MessageVersion.Soap11;

    CustomBinding newBinding = new CustomBinding(elements);

    return newBinding;
}
private Binding CreateBindingSoap11\u NoTimeStamp()
{
BasicHttpBinding httpBinding=新的BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
BindingElementCollection-elements=httpBinding.CreateBindingElements();
elements.Find().IncludeTimestamp=false;
elements.Find().MessageVersion=MessageVersion.Soap11;
CustomBinding newBinding=新的CustomBinding(元素);
返回新绑定;
}

当然,它也适用于NetTcpBinding

为什么服务器时间会改变一个小时?如果是因为夏令时,操作系统选项应该处理夏令时,并且不会影响连接。@ChrisF因为服务器(或客户端)不同步而需要调整时间。为什么它们不同步?您应该将计算机同步到外部时间服务器。如果您这样做,则它们的不同步不会超过几秒钟。@ChrisF如果我们无法连接到外部服务器,并且设置我们自己的内部服务器仍会有相同的问题,最终它们将不同步,在可接受的范围内实现这一点的解决方案通常过于昂贵。请更新您的问题,以包含这些新的高度相关的信息,包括为什么您无法连接到外部时间服务器。没有它,你就不会得到一个真正解决你问题的答案。