【问题标题】:Passing IEnumerable<int> as parameter to WCF service将 IEnumerable<int> 作为参数传递给 WCF 服务
【发布时间】:2014-03-10 20:59:34
【问题描述】:

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

【问题讨论】:

  • 尝试获取服务的 WSDL。合同模式是否与您的 XML 匹配?
  • @MauriceStam 出于与问题stackoverflow.com/questions/21127021/… 相同的原因,我无法看到 wsdl。我只需要让服务了解我提供的 xml 格式

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


【解决方案1】:

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

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

例如:

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

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

问候,

【讨论】:

  • 非常感谢!可以使用XmlSerializerFormat 属性标记的方法
【解决方案2】:

我认为您需要为默认的 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 ?

【讨论】:

  • 不能用xml做任何事,只能服务
  • 嗯,至少我设法提供了一个更复杂的替代方案:P Seymor 的答案显然要干净得多
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 2011-10-10
相关资源
最近更新 更多