24

WCF サービスには、[DataContract] 属性を持つ 2 つのクラスがあります。これらのクラスの 1 つは、他のクラスと「is-a」の関係を持っているため、クラス B はクラス A から継承できます。サービスをテストするとき。

これはWCFで可能ですか? 別の属性がありませんか?

[DataContract]
public class A
{        
    [DataMember]
    public MyCustomType AValue1{ get; set; }

    [DataMember]
    public MyCustomType AValue2 { get; set; }
}

[DataContract]
public class B: A
{       
   [DataMember]
   public double BValue1{ get; set; }

   [DataMember]
   public double BValue2 { get; set; }
}

注: カスタム型も、データ コントラクトを使用して定義されます。

更新: 以下はエラーです:

エラー: http://localhost:8002/GISDataServices/mexからメタデータを取得できませんこれが Windows (R) Communication Foundation サービスにアクセスできる場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8002/GISDataServices/mex Metadata contains ) を参照してください。解決できない参照: ' http://localhost:8002/GISDataServices/mex '。 Receivera:InternalServiceFault内部エラーのため、サーバーは要求を処理できませんでした。エラーの詳細については、サーバーで (ServiceBehaviorAttribute または <serviceDebug> 構成動作のいずれかから) IncludeExceptionDetailInFaults をオンにして、例外情報をクライアントに送り返すか、Microsoft .NET Framework に従ってトレースをオンにします。 3.0 SDK ドキュメントを参照し、サーバー トレース ログを調べます。HTTP GET エラー URI: http://localhost:8002/GISDataServices/mex ' http://localhost:8002/GISDataServices/mex ' の ダウンロード中にエラーが発生しました。リクエストは HTTP ステータス 400: Bad Request で失敗しました。

更新 2:以下の私の回答を参照してください。

4

3 に答える 3

39

はい。ただし、基本クラスを派生クラスの型で構築する [KnownTypeAttribute] で装飾する必要があります。例えば:

[DataContract]
[KnownType(typeof(B))]
public class A
{
   [DataMember]
   public string Value { get; set; }
}

[DataContract]
public class B : A
{
   [DataMember]
   public string OtherValue { get; set; }
}
于 2009-02-04T15:26:44.827 に答える
7

さて、私は質問を理解しました。答えは...私はばかです。それは相続とは何の関係もありませんでした。基本クラスには、「set」プロパティ句のないデータコントラクトメンバーがありました。「get」のみです。ドー!!! 'set'句を入れると、チャームのように機能します。

混乱させて申し訳ありません。

于 2009-02-04T16:23:13.793 に答える
1

このテストに基づいて、正常に動作するはずです。両方のクラスにデフォルトコンストラクタがありますか?自動プロパティを使用していますか。この基本的なサンプルでは、​​属性は必要ありません。また、David Mortonが、返す要素によっては、KnownType属性が必要になる可能性があると述べたように、私は100%ではありませんが、既知のタイプは操作コントラクトに従わなければならない場合があります。

class Program
{
    static void Main(string[] args)
    {
        var serializer = new DataContractSerializer(typeof(Employee));

        var employee = new Employee() { Name="Joe", Salary=100000  };
        using (var ms = new MemoryStream())
        {
            serializer.WriteObject(ms, employee);

            ms.Position = 0;

            var newEmployee = serializer.ReadObject(ms) as Employee;
        }

        Console.ReadKey();

    }
}

[DataContract]
public class Employee : Person
{
    [DataMember]
    public decimal Salary { get; set; }
}

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }
}

[ServiceContract]
interface IEmployeeService
{
    [OperationContract]
    Person GetPerson();

    [OperationContract]
    Employee GetEmployee();

    [OperationContract]
    [KnownType(typeof(Employee))]
    Person GetEmployeeAsPerson();
}
于 2009-02-04T15:29:43.603 に答える