将IEnumerable <int>作为参数传递给WCF服务</int>

时间:2014-02-12 13:39:42

标签: c# .net xml web-services wcf

我的xml看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</items>

和wcf服务合同:

[ServiceContract(Namespace = "", Name = "MyService", SessionMode = SessionMode.NotAllowed)]
public interface IMyService
{
    [OperationContract]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    void DoWork(IEnumerable<int> items);
}

服务绑定是基本的http。 但是,当我尝试将该xml发布到wcf方法时,我收到错误: Unable to deserialize XML message with root name "items" and root namespace ""

wcf方法应如何正确使用该xml?

2 个答案:

答案 0 :(得分:3)

您的服务合同似乎未正确设置。

我认为你需要实现一个“包装器”类,它定义了一个与你的XML相匹配的类型结构。

例如:

[XmlRoot("items")]
public class MyItems
{
    [XmlElement("item")]
    public List<int> Items { get; set; }
}

我刚刚整理了一个快速测试应用程序,并使用您的示例XML(通过soapUI REST客户端)成功验证了该界面。

此致

答案 1 :(得分:0)

我认为您需要为默认的xml反序列化指定根命名空间。如果这不适合您,您可能需要更改服务接口以接受流。

以下是有关此主题的更多信息:http://www.codeproject.com/Articles/35982/REST-WCF-and-Streams-Getting-Rid-of-those-Names-Sp

要实际回答您的问题,您可以尝试以下方法:

<?xml version="1.0" encoding="UTF-8"?>
<items xmlns="http://schemas.datacontract.org/2004/07/" 
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</items>

编辑:那不是你的问题。所以实际回答你的问题:

[OperationContract]
[WebInvoke(BodyStyle =
    WebMessageBodyStyle.Bare, Method = "POST", ResponseFormat = WebMessageFormat.Xml,)] 
    void DoWork(Stream data);

另一个替代方案可能是自定义数据提取(签名:void DoWork(MyCustomDataContract data);)和自定义反序列化,例如: How to use Custom Serialization or Deserialization in WCF to force a new instance on every property of a datacontact ?