【问题标题】:WCF Time changes on server causes disconnect服务器上的 WCF 时间更改导致断开连接
【发布时间】:2017-01-12 18:46:31
【问题描述】:

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

问题是,我们能否防止客户端在服务器时间更改时断开连接,因为我觉得这种行为很奇怪,让所有客户端断开连接是一个真正的问题。

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

【问题讨论】:

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

标签: wcf time


【解决方案1】:

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

这是一个项目的示例代码,我很好奇它是否有效!请注意,此代码还设置了 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;
}

当然它也适用于 NetTcpBinding

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多