WCF如何将List <t>作为XML请求发送

时间:2015-07-23 09:46:19

标签: c# .net xml wcf

对于WCF,DataContracts等人来说相当新,这是我关于SO的第一个问题。

问题: 我想向我的WCF服务发送一个xml请求。 请求具有以下布局;

<DataContractName>
  <Other Stuff>
   <Blah></Blah>
  </Other Stuff>
  <IdList>
   <Id>1</Id>
   <Id>2</Id>
  <IdList>
</DataContractName>

[DataContract(Name="DataContractName")]
public sealed class Request
{
   [DataMember]
   public List<string> IdList :get;set;}
}

运行此请求最终以空列表结束,因此不会产生我预期的结果。 浏览网络并最终主要在Stackoverflow上找到我在下面找到的链接。 然而,他们似乎都没有对我有正确的回应。

How to send list of objects to WCF service?

how to pass List<Object> to WCF

Passing List<T> as parameter to WCF service operation

当我使用以下布局时,请求按预期工作。

有效吗

<DataContractName>
  <Other Stuff>
    <Blah></Blah>
  </Other Stuff>
  <IdList xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>1</a:string>
    <a:string>2</a:string>
  <IdList>
</DataContractName>

显然我希望能够摆脱列表元素的命名空间和字符串注释。 根据以下链接中的信息,必须可以不使用命名空间注释。

REST-ful WCF service: Deserializing C# List of Strings not working properly     - &GT;  https://msdn.microsoft.com/en-us/library/aa347850.aspx

然而,我无法使其发挥作用。

我做了什么: 创建了一个新的CollectionDataContract;

[CollectionDataContract]
public sealed class IdsList : Collection<string>
{    
}

并在我现有的合同中使用它

[DataContract(Name="DataContractName")]
public sealed class Request
{
   [DataMember]
   public IdsList IdList {get;set;}
}

然而,当我运行它时,结果不是我所期望的(再次列出空列表)。

那么我该怎么做才能创建一个我的服务能理解的有效请求呢?

OT:为什么不只是一个简单的&lt; code&gt;标记

1 个答案:

答案 0 :(得分:2)

我在这里测试了您的代码,我只是在属性中添加了一些数据并且工作正常。

首先,在接口中我声明了一个命名空间:

[DataContract(Namespace = "http://customnamespace")]
    public class Result
    {
        [DataMember]
        public string Bla { get; set; }

        [DataMember]
        public IdsList List { get; set; }
    }

Secound,在集合类中,我还声明了命名空间(我使用了相同的接口)和itemname:

[CollectionDataContract(ItemName = "List", Namespace = "http://customnamespace")]
    public class IdsList : List<string>
    {

    }

返回的xml在集合成员中没有名称空间声明。 希望它有所帮助。