套接字连接已中止 - CommunicationException

Goo*_*ber 23 .net c# wcf exception-handling

本来:

  • 我认为这是一个循环参考问题........事实证明它不是.
  • 问题产生于根本没有配置服务配置.
  • 由于默认值非常低,因此发送大量数据会导致服务崩溃.

场景:

  • 看来我的WCF服务中可能有循环引用,但使用"[DataContract(IsReference = true)]",没有任何帮助解决它.
  • 我收到错误"套接字连接已中止.这可能是由于处理您的消息时出错或远程主机超出接收超时或基础网络资源问题引起的.本地套接字超时为'00:01:00' ".
  • 我错过了什么吗?

码:

[DataContract(IsReference=true)]
public class Message
{
    [DataMember]
    public string TopicName { get; set; }

    [DataMember]
    public string EventData { get; set; }

    [DataMember]
    public SerializableDictionary<string, FuturesLineAsset> FuturesLineDictionary { get; set ; }
}
Run Code Online (Sandbox Code Playgroud)

思考:

  • 我想知道是不是因为我有一个类FuturesAsset,它有一个BindableDictionary类型的属性(这是一个CUSTOM OBJECT),该属性包含一个FuturesLinesAssets列表.
  • 见下文:

家长:

public class FuturesAsset
{
    public string AssetName { get; set; }
    public BindableDictionary<string, FuturesLineAsset> AssetLines { get; private set; }

    public FuturesAsset()
    {
        AssetLines = new BindableDictionary<string, FuturesLineAsset>();
    }

    public FuturesAsset(string assetName)
    {
        AssetLines = new BindableDictionary<string, FuturesLineAsset>();
        AssetName = assetName;
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童:

public class FuturesLineAsset
{

    public string ReferenceAsset { get; set; }
    public string MID { get; set; }
    public double LivePrice { get; set; }
    public DateTime UpdateTime { get; set; }
    public DateTime LastContributedTime { get; set; }
    public double Spread { get; set; }
    public double Correlation { get; set; }
    public DateTime Maturity { get; set; }
    public double ReferenceCurve { get; set; }

    public FuturesLineAsset(string mID, string referenceAsset, double livePrice)
    {
        MID = mID;
        ReferenceAsset = referenceAsset;
        ReutersLivePrice = livePrice;
    }
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*n T 19

这个错误可能是由许多事情引起的.虽然在这种情况下这是一个时间问题,但它通常与时间无关,特别是如果立即收到错误.可能的原因是:

  • 在合同中用作参数或返回类型的对象没有无参数构造函数,并且未使用DataContract属性进行修饰.检查用作参数或返回类型的类,以及这些类的公共属性使用的所有类型.如果使用其中一个类的参数实现构造函数,编译器将不再为您添加默认的无参数构造函数,因此您需要自己添加它.
  • 服务配置中定义的默认限制太低(MaxItemsInObjectGraph,MaxReceivedMessageSize,MaxBufferPoolSize,MaxBufferSize,MaxArrayLength).
  • DataContract对象的某些公共属性是只读的.确保所有公共属性都有getter和setter.

  • 传递不带.TableName的DataTable或不带数据的空表(新DataTable())也会导致这种情况。 (2认同)
  • 我有这个错误,根本原因是WCF.当我离开WCF时,问题就消失了. (2认同)

the*_*onk 13

该异常与循环引用无关,当您尝试通过线路抽取大量数据时,它只是完全超时.

WCF附带的默认值非常低(我相信这些在WCF 4中已经更改).阅读这两篇博客文章,他们应该让您了解如何解决您的服务:

创建高性能WCF服务

如何限制Wcf服务,帮助防止DoS攻击,并维护Wcf可伸缩性

更新:此外,WCF配置中有许多不同的超时,并且取决于它是您正在谈论的客户端还是服务器,您需要更新不同的超时子句...请阅读此线程,了解每个意味着什么你应该能够弄清楚你需要碰到哪一个.或者,您可以将每个超时设置为int.max,如果您真的不在乎呼叫是否需要很长时间才能完成.


小智 5

出现此问题的原因是从 Windows 服务主机安装程序的 OnStart 事件调用了较长的初始化过程。通过设置 TCP 绑定的安全模式和超时来修复。

            // Create a channel factory.
            NetTcpBinding b = new NetTcpBinding();
            b.Security.Mode = SecurityMode.Transport;
            b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
            b.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;

            b.MaxReceivedMessageSize = 1000000;
            b.OpenTimeout = TimeSpan.FromMinutes(2);
            b.SendTimeout = TimeSpan.FromMinutes(2);
            b.ReceiveTimeout = TimeSpan.FromMinutes(10);
Run Code Online (Sandbox Code Playgroud)