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