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集合成员中没有命名空间声明。
希望对你有帮助。
对 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集合成员中没有命名空间声明。 希望对你有帮助。