4

サービスコード:

[ServiceContract]
    public interface IServices
    {
        [OperationContract]
        [XmlSerializerFormat]
        GetProductsResponse Getproducts(GetProductsRequest productsrequest);

    [OperationContract]
    SaveProductsResponse SaveProducts1(SaveProductsRequest1 productsrequest);
} 


public class GetProductsRequest
{
    [XMLElement]
    public string id;

    [XMLElement,typeof(Person)]
    public Person[] Persons;
}

[DataContract]
public class SaveProductsRequest1
{
    [DataMember]
    public List<Person> Persons;
}


[DataContract]
public class Person
{
    [DataMember]
    public int Id;

    [DataMember]
    public string Name;

    [DataMember]
    public Sex Sex;
}

[DataContract]
public enum Sex
{
    [EnumMember]
    Male,
    [EnumMember]
    Female
}

クライアント :

ServicesClient client = new ServicesClient();
SaveProductsRequest1 req = new SaveProductsRequest1();
req.Persons = new List<Person> { new Person { Id = 10, Name = "Al", Sex = Sex.Female} }.ToArray();

client.SaveProducts1(req);

サービス側で値'Al'(文字列)を取得できます。ただし、値10およびMale(値タイプ)は、サービス側でデフォルト(0およびMale)にリセットされます。

これは、サービスコントラクト(この場合はGetProducts)のいずれかのメソッドにXmlSerializerFormatがあり、任意の配列プロパティと1つの追加の文字列プロパティにXMLElementを配置したときにGetProductsクラス内にある場合にのみ発生します。

WCFランタイムに問題がありますか?

4

3 に答える 3

3

サーバー側のコードを使用してテストWCFサービスをセットアップし、サンプルのクライアント側コードを使用してテストクライアントを再度セットアップしました。これは正常に機能します。

ここに画像の説明を入力してください

ご覧のとおり、Person3つの値すべてがそのままの状態で1が送信されました。あなたの側で何か違うことが起こっている場合、それはあなたの設定ファイルの設定オプションに関連しているかもしれませんが、基本的には:コードは機能します。.NET4.5を使用してテストしています

于 2013-03-06T09:39:54.747 に答える
0

これは、サービス コントラクト (この場合は GetProducts) のいずれかのメソッドに XmlSerializerFormat がある場合にのみ発生します。

この場合、WCF はXmlSerializerデータをシリアル化するために使用します。したがって、適用[DataContract][DataMember]適用もありません。本当に を使用するXmlSerializer必要があり、さらに XML シリアライゼーションを制御する必要がある場合は、その特定の属性 ( 、 、 など[XmlElement])[XmlAttrribute]を使用する必要があります[XmlIgnore]。フィールドまたはプロパティの意図しない名前変更によって発生する発見しにくい問題を回避するために、明示することをお勧めします。

public class Person
{
    [XmlElement("Id")]
    public int Id { get; set; }

    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlIgnore] // don't tell the stranger
    public Sex Sex { get; set; }
}

[Serializable]また、属性は XML シリアライゼーションおよびデータ コントラクト シリアライゼーションとは関係がないことに注意してください。バイナリシリアライゼーションのみに関連しています。

于 2013-03-06T09:30:12.923 に答える