经过2年的良好工作,我的WCF服务开始关闭连接

时间:2014-12-01 09:10:45

标签: c# wcf

我工作的WCF服务有一个奇怪的问题。突然间,它开始过快关闭连接。我没有改变,也没有改变服务,也没有改变客户。我怀疑运行服务的机器运行速度较慢,但​​这也开始在我的机器上发生。 为了解决这个问题,我将app.config文件更改为具有以下配置:

    <services>
  <service behaviorConfiguration="eit" name="Siv.WcfTcpProxy.WcfTcpDataProxyService">
    <endpoint address="net.tcp://localhost:51646/WcfTcpProxy" binding="netTcpBinding"
      bindingConfiguration="NewBinding0" name="default" contract="Siv.WcfTcpProxy.IWcfTcpDataProxy" />
    <host>
      <timeouts closeTimeout="00:01:10" />
    </host>
  </service>
</services>

    <binding name="NewBinding0" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" transactionFlow="true" transferMode="Buffered"
      maxBufferSize="655360" maxReceivedMessageSize="655360">
      <readerQuotas maxDepth="655360" maxStringContentLength="655360"
        maxArrayLength="655360" maxBytesPerRead="655360" maxNameTableCharCount="655360" />
    </binding>
  </netTcpBinding>

但这仍然没有帮助。 我的合同如下:

// a service contract.
[ServiceContract(Namespace = "http://Siv.WcfTcpProxy", 
    CallbackContract = typeof(IDataCallback), 
    SessionMode = SessionMode.Required,
    ProtectionLevel = ProtectionLevel.None)]
public interface IWcfTcpDataProxy
{
    [OperationContract]
    bool PassData(byte[] data, int clientId);

    [OperationContract(IsInitiating = true)]
    SubscriptionData Subscribe(string appVersion, string appName);

    [OperationContract(IsTerminating = true)]
    void Unsubscribe(int id);
}

// a service contract callback.
public interface IDataCallback
{
    [OperationContract(IsOneWay = true)]
    void ResendData(byte[] data);
}

// Service class which implements the service contract.
[ServiceBehavior(IncludeExceptionDetailInFaults = true,
    UseSynchronizationContext = false,
    InstanceContextMode = InstanceContextMode.PerSession,
    ConcurrencyMode = ConcurrencyMode.Multiple)]
//[ErrorBehavior(typeof(CalculatorErrorHandler))]
public class WcfTcpDataProxyService : ServiceBase, IWcfTcpDataProxy
{
...
}

我在WCF跟踪中看到的是,在向Subscribe()发送响应后,连接已关闭。但我仍然可能误解了WCF日志。

欢迎提供任何线索,包括有关高级WCF的优秀阅读材料。

1 个答案:

答案 0 :(得分:1)

可能有一些环境原因:

检查系统时钟,正如ShellShock指出的那样。 sku值通常为5分钟。 WCF跟踪可能不会给您任何帮助,您可能需要在服务器端和客户端检查事件查看器。

ShellShock指出的防火墙规则。您或系统管理员是否已经更改了规则,可能会终止/损坏某些“可疑”连接?您需要咨询系统管理员并检查http对话的详细信息。

Windows更新。发生问题的最近几天是否更新了Windows?我有经验,.NET的某些更新引入了问题。

为了隔离可能的环境因素,您最好拥有一些测试环境,并在系统更新/升级中保守一些。例如,您应关闭Windows自动更新并获得通知。何时更改某些计算机设置(例如machine.config或防火墙规则),首先在测试环境或登台环境中执行此操作,然后观察并测试几天。