【问题标题】:An existing connection was forcibly closed by the remote host in WCFWCF 中的远程主机强制关闭现有连接
【发布时间】: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:现有连接被远程主机强行关闭

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

【问题讨论】:

    标签: c# .net wcf exception-handling


    【解决方案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】:

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

          【讨论】:

            猜你喜欢
            • 2011-11-04
            • 2013-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多