我的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?
答案 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 ?