底层连接在 WCF 中使用序列化程序关闭

Posted

技术标签:

【中文标题】底层连接在 WCF 中使用序列化程序关闭【英文标题】:The underlying connection was closed in WCF with Serializers 【发布时间】:2013-01-21 06:35:27 【问题描述】:

我有一个带有服务接口的 WCF 服务

[ServiceContract]    
public interface IMyService

    [OperationContract]
    [ServiceKnownType(typeof(Person))]
    [ServiceKnownType(typeof(Employee))]
    IPerson GetPerson();
 

我的 GetPerson 实现是

 public IPerson GetPerson()
 
        IPerson obj = new Person();
        obj.FirstName = "Bhuvan";
        obj.LastName = "Ram";        
        return obj;
  

在我的客户端中,我使用的很简单

KnownType.MyServiceClient obj = new KnownType.MyServiceClient();
Person objp = (Person)obj.GetPerson()'

但是当我尝试访问时,我收到一个错误

底层连接已关闭:连接意外关闭。

我的堆栈跟踪是这样的

在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度超时) 在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)..

我的员工班级是

> [DataContract(Name = "Employee")] [KnownType(typeof(IEmployee))] 公共类员工:IEmployee [数据成员] 公共字符串 EmployeeName 得到;设置;

> 我的人班是 [DataContract(Name = "Person")] [KnownType(typeof(IPerson))] 公共类人员:IPerson #region IPerson 成员 [数据成员(名称=“名字”)] 公共字符串名字 获取;放;

 [DataMember(Name = "LastName")]
 public string LastName  get; set; 
 #endregion

我该如何解决这个问题?

【问题讨论】:

再贴一些IPerson的代码来了解属性是如何声明的 如果在 .NET 4.5 上并且它在 .NET 4.0 上工作,已知问题。在此处或在 Google 上搜索。 我正在使用 .Net 4.0,如果我只使用 [ServiceKnownType(typeof(Person))] 它工作正常。但如果我使用多种已知类型,则为 [ServiceKnownType(typeof(Person))] [ServiceKnownType(typeof(Employee))] 那么它不起作用。我想访问 Employee 和 Person 作为我班级中的已知类型 使用任何一个(Knowntype/ServiceKnownType)。如果您在 ServiceContract 中使用 ServiceKnownType,则无需在具体类中使用 knowntype。否则在任何地方都使用 Knowntype。 员工不是IPerson吗? 【参考方案1】:

具体类 Person 可能存在序列化问题。

 [ServiceContract]
 public interface IMyService
 
    [OperationContract]
    IPerson GetPerson();
  

 public interface IPerson
 
   string FirstName  get; set; 
   string LastName  get; set; 
 

   [DataContract(Name = "Person")]
   [KnownType(typeof(IPerson))]
  public class Person : IPerson
  
     [DataMember(Name = "FirstName")]
     public string FirstName  get; set; 

     [DataMember(Name = "LastName")]
     public string LastName  get; set; 
  

可以在方法签名上使用ServiceKnownType属性,而不是在整个类上使用KnownType属性

[OperationContract]
[ServiceKnownType(typeof(Person))]
IPerson GetPerson();

来源:Check this link for detail

参考:Using Knowntype

注意:

在任何地方使用 Knowntype 或仅在 ServiceContract 上使用 ServiceKnowntype。 尝试对 Person 和 Employee 类的 DataContract 使用唯一的命名空间。

【讨论】:

嗨,如果我只使用 Person 的 [ServiceKnownType(typeof(Person))] 它工作正常。但是如果我一次使用 Person 和 Employee [ServiceKnownType(typeof(Person))] [ServiceKnownType(typeof(Employee))] 它不起作用 查看 Employee like Person 的属性。它们标记正确吗? 单独两个都可以正常工作,但是当我们结合它们时,它们都没有工作 考虑两件事。 1) 在任何地方使用 Knowntype 或仅在 ServiceContract 上使用 ServiceKnowntype。 2) 尝试对 Person 和 Employee 类的 DataContract 使用唯一的命名空间 你是对的,如果我使用它,它工作正常。现在我可以将数据从客户端发送到服务器,也可以将服务器发送到客户端。但是如果我实现 List getEmpList get;放;在服务器端的我的 Person 类中。我正在尝试在客户端分配相同的列表以将数据发送为 objPerson.EmployeeList = lstEmp;但我收到客户端错误为“无法将员工隐式转换为对象”。我该如何克服这个

以上是关于底层连接在 WCF 中使用序列化程序关闭的主要内容,如果未能解决你的问题,请参考以下文章

我是不是必须使用 WCF 对 silverlight 应用程序中的对象进行序列化/反序列化?

底层连接被关闭:连接被意外关闭

通过 WCF 序列化异常

跨 WCF Web 服务请求序列化通用 XML 数据

WCF 序列化长命名空间被重复而不是前缀

我可以告诉 WCF WebAPI 序列化程序忽略嵌套类对象吗?