WCF 中的远程主机强制关闭现有连接

Posted

技术标签:

【中文标题】WCF 中的远程主机强制关闭现有连接【英文标题】:An existing connection was forcibly closed by the remote host in WCF 【发布时间】:2011-01-06 10:59:36 【问题描述】:

我有一个名为“模板”的抽象类定义为:

[DataContract]
public abstract class Template

    [DataMember]
    public virtual int? Id  get; set; 
    [DataMember]
    public virtual string Title  get; set; 
    [DataMember]
    public virtual byte[] TemplateDoc  get; set; 
    [DataMember]
    public virtual bool IsSystemTemplate  get; set;         

两个派生类:UserTemplate 和 SystemTemplate 实现上述抽象类,定义为:

public class UserTemplate : Template

    [DataMember]
    public virtual Int32? OfficeId  get; set; 

    [DataMember]
    public virtual Int32? UserId  get; set; 

    protected UserTemplate()  

    public UserTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int officeId, int? userId)
    
        this.Title = title;
        this.TemplateDoc = templateDoc;
        this.IsSystemTemplate = false;
        this.OfficeId = officeId;
        this.UserId = userId;
    


public class SystemTemplate : Template

    [DataMember]
    public virtual Int32? MultiListGroupId  get; set; 

    protected SystemTemplate()  

    public SystemTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int multiListGroupId)
    
        this.Title = title;
        this.TemplateDoc = templateDoc;
        this.IsSystemTemplate = true;
        this.MultiListGroupId = multiListGroupId;
    

现在,当我尝试调用以下服务方法时:

List<Template> GetTemplatesByTemplateType(int officeId, int? userId, TemplateType templateType)

我收到此错误:

System.Net.Sockets.SocketException:现有连接被远程主机强行关闭

是因为我试图返回一个抽象类的原因吗? 如果我尝试使用单元测试调用此方法,它运行良好。

【问题讨论】:

【参考方案1】:

是的,问题是您的抽象基类需要使用 KnownType 和 XmlInclude 属性进行修饰。见这里:http://geekswithblogs.net/ugandadotnet/archive/2008/05/27/serializing-an-abstract-data-contract.aspx

【讨论】:

【参考方案2】:

除了 grenade 的回答是让 WCF 知道这些后代类使用 KnownType(或 ServiceKnownType)属性,您还必须使用 [DataContract] 属性自己装饰后代类。

[DataContract]
public class UserTemplate : Template

    ......


[DataContract]
public class SystemTemplate : Template

    ......

在 WCF 中,这些属性几乎不会从父级继承到子级 - 您需要非常明确并清楚地了解您在各个级别的意图。

查看这篇博文All About KnownTypes,了解有关 KnownTypes 和 ServiceKnownTypes 属性的更多信息。

【讨论】:

【参考方案3】:

在您的网络配置文件中添加此 datacontractserializer 行

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior >
        **<dataContractSerializer maxItemsInObjectGraph="2147483646"/>**
     </behavior >
 </serviceBehaviors>
</behaviors>
</system.serviceModel>

【讨论】:

【参考方案4】:

我曾经遇到过这个错误,这很令人困惑。我的问题是服务参考由于某种原因不是最新的,因此更新服务参考会有所帮助。

【讨论】:

以上是关于WCF 中的远程主机强制关闭现有连接的主要内容,如果未能解决你的问题,请参考以下文章

如何修复`EF Core中的远程主机`错误强制关闭现有连接

Python异常:ConnectionError 10054远程主机强制关闭现有连接

页面加载时获取“现有连接被远程主机强制关闭”,但重新加载时没有

如何正确关闭客户端代理(现有连接被远程主机强行关闭)?

解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接

现有连接被远程主机强行关闭