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

WCF How to send a List<T> as XML Request

对 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;}
}

运行 这个请求以一个空列表结束,因此没有产生我预期的结果。 浏览网络并最终主要访问 Whosebug,我在下面的链接中找到了它。 但是 none 他们似乎对我有正确的回应。

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 --> 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:为什么不只是一个简单的 标签?

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

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

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

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

其次,在集合 class 中,我还声明了名称空间(我使用了相同的接口)和项目名称:

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

    }

返回的xml集合成员中没有命名空间声明。 希望对你有帮助。