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 タイムアウト)
で System.Net.HttpWebRequest.GetResponse()
で System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest .WaitForReply(TimeSpan タイムアウト)..

私の従業員クラスは

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

> 私の Person クラスは [DataContract(Name = "Person")] [KnownType(typeof(IPerson))]
public class Person: IPerson {
#region IPerson メンバー [DataMember(Name = "FirstName")] public string FirstName { get; 設定; }

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

}

これを解決するにはどうすればよいですか?

4

1 に答える 1

0

Concrete クラスの 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; }
  }

クラス全体で KnownType 属性を使用するのではなく、メソッド シグネチャで ServiceKnownType 属性を使用できます。

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

出典: 詳細はこちらのリンクをチェック

参照 :既知の型の使用

ノート:

  • あらゆる場所で Knowntype を使用するか、ServiceContract でのみ ServiceKnowntype を使用します。
  • Person および Employee クラスの DataContract に一意の名前空間を使用してみてください。
于 2013-02-06T07:03:51.870 に答える