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 中的远程主机强制关闭现有连接的主要内容,如果未能解决你的问题,请参考以下文章
Python异常:ConnectionError 10054远程主机强制关闭现有连接
页面加载时获取“现有连接被远程主机强制关闭”,但重新加载时没有
解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接