2

我有一个带有服务接口的 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(TimeSpan timeout)
在 System.Net.HttpWebRequest.GetResponse()
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest .WaitForReply(时间跨度超时)..

我的员工班是

> [DataContract(Name = "Employee")] [KnownType(typeof(IEmployee))]
public class Employee:IEmployee { [DataMember] public string EmployeeName { get;set; } }

> 我的人员类是 [DataContract(Name = "Person")] [KnownType(typeof(IPerson))]
public class Person: IPerson {
#region IPerson Members [DataMember(Name = "FirstName")] public string FirstName { get; 放; }

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

}

我该如何解决这个问题?

4

1 回答 1

0

具体类 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();

来源: 查看此链接了解详情

参考:使用已知类型

笔记:

  • 在任何地方使用 Knowntype 或仅在 ServiceContract 上使用 ServiceKnowntype。
  • 尝试对 Person 和 Employee 类的 DataContract 使用唯一的命名空间。
于 2013-02-06T07:03:51.870 回答