代码之家  ›  专栏  ›  技术社区  ›  Jerod Houghtelling

套接字连接已中止。可能的序列化异常?

  •  0
  • Jerod Houghtelling  · 技术社区  · 16 年前

    这是误导,因为它显示约59秒,但发生异常的时间约为2秒。上次我收到这个错误消息时,它与序列化实体框架对象引起的无限循环有关。幸运的是,我刚刚做了改变,所以很容易发现。

    这一次我不知道是什么变化导致了这一切。我对实体框架类进行了更改,以发现没有任何更改。据我所知,数据库也保持不变,尽管我不知道如何证明这一点,因为它相当大。

    如果我使用调试器逐步检查WCF代码,我会发现它正在正确地收集数据。它甚至试图返回信息。但是,在客户端代理中,我收到以下代码行的异常:

    return Channel.GetDocuments( user, criterion );

    有人有什么见解或工具可以帮助我追踪这个例外吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Jerod Houghtelling    16 年前

    我发现了问题。这与从数据库中删除一列有关,实体框架模型没有更新。这不是我以前认为的循环。

    这是给我指出正确方向的诀窍。

    客户端代理

    public List<ImageData> GetDocuments( User user, DocumentSearchCriterion criterion )
    {
        Channel.GetDocuments( user, criterion );
    }
    

    public List<ImageData> GetDocuments( User user, DocumentSearchCriterion criterion )
    {
        List<ImageData> documents = new DocumentRepository().GetDocuments( user, criterion );
    
        // Temporary test to see if we can serialize the data. This is only for debugging
        // purposes and needs to be removed from production code.
        DataContractSerializer serializer = new DataContractSerializer( documents.GetType() );
        using( FileStream stream = new FileStream( "SerializerOutput.xml", FileMode.Create ) )
        {
            // This line will give an exception with useful details while debugging.
            serializer.WriteObject( stream, documents );
        }
    
        return documents;
    }
    

    希望这能帮助其他人解决这个普遍的和误导性的例外。

        2
  •  0
  •   Steve Sheldon    16 年前

    检查以下各项:

    1. 您有大量数据,因此需要延长.config文件中的超时时间
    2. 根据我的经验,最可能的情况是,在从WCF函数返回的类型中有一个循环引用。

    [DataContract]
    public class MyClass
    {
        public ChildObject(int i)
        {
        }
    
        [DataMember]
        public MyClass Parent
        {
            get;
            set;
        }
    }
    
    推荐文章