【问题标题】:XML&WCF POST request: some parameters are read, other notXML&WCF POST 请求:某些参数已读取,其他未读取
【发布时间】:2015-07-07 07:42:13
【问题描述】:

我在 IIS 服务器上有一个 wcf restful 服务。

我做了一些API,可以称为发送xml或json。

我已经创建了我的 C# 类,然后我正在对其进行测试。 JSON 是完美的,但 XML 请求仍然存在一些问题。

我想用帖子发送 xml,这是我发送的 xml:

<?xml version="1.0" encoding="utf-8" ?>
<SetClientiXML
  xmlns="http://tempuri.org/">
  <dati>
    <ArrayOfWrapClienti
      xmlns="http://schemas.datacontract.org/2004/07/MultipayOnline"
      xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <WrapClienti>
        <CODRETE>0018</CODRETE>
        <CODICE>20685</CODICE>
        <NOME>A.T.E.R. Azienda Territoriale</NOME>
        <INDIRIZZO>PIAZZA POZZA</INDIRIZZO>
        <CITTA>Verona</CITTA>
        <CAP>37123</CAP>
        <PROV>VR</PROV>
        <CODICEFISCALE>00223640236</CODICEFISCALE>
        <PIVA>223640236</PIVA>
        <EMAIL/>
        <ESPOSIZ_CONTABILE>937,02</ESPOSIZ_CONTABILE>
        <STATO>FALSE</STATO>
      </WrapClienti>
    </ArrayOfWrapClienti>
  </dati>
  <retista>3303903</retista>
  <hashedString>oklkokokokok</hashedString>
</SetClientiXML>

wcf 读得很好“retista”和“hashedString”,但“dati”是空的(0 个元素),而我希望它有我发送的“wrapClienti”对象。 这是我的 API 原型:

    [OperationContract]
    [WebInvoke(UriTemplate = "SetClienti.xml", Method = "POST", BodyStyle=WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Xml)]
    GenericResponse SetClientiXML(List<WrapClienti> dati, string retista, string hashedString);

所以,问题是 List 是空的.. 为什么?如何编写 xml 以使列表可读? 罢工> 问我是否可以提供更多详细信息。

更新:更奇怪!

有了这个xml:

<?xml version="1.0" encoding="utf-8" ?><SetClientiXML xmlns="http://tempuri.org/">
    <dati>
        <WrapClienti xmlns="http://schemas.datacontract.org/2004/07/MultipayOnline" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
            <CODRETE>0018</CODRETE> 
            <CODICE>20685</CODICE> 
            <NOME>A.T.E.R. Azienda Territoriale</NOME> 
            <INDIRIZZO>PIAZZA POZZA</INDIRIZZO> 
            <CITTA>Verona</CITTA> 
            <CAP>37123</CAP>
            <PROV>VR</PROV> 
            <CODICEFISCALE>00223640236</CODICEFISCALE> 
            <PIVA>223640236</PIVA> 
            <EMAIL/> 
            <ESPOSIZ_CONTABILE>937,02</ESPOSIZ_CONTABILE> 
            <STATO>FALSE</STATO> 
        </WrapClienti> 
    </dati>
    <retista>3303903</retista>
    <hashedString>oklkokokokok</hashedString>
</SetClientiXML>

wcf 读取了 List 的一些属性,而其他.. 都是 nul!!!

我的 WrapClienti 我有很多属性。其中两个是:

    private string p_CAP { get; set; }
    public string CAP
    {
        get
        {
            if (model == null)
                return p_CAP.ToSafeString();
            else
                return this.model.CAP.ToSafeString();
        }
        set { p_CAP = value; }
    }
    private string p_PROV { get; set; }
    public string PROV
    {
        get
        {
            if (model == null)
                return p_PROV.ToSafeString();
            else
                return this.model.PROV.ToSafeString();
        }
        set { p_PROV = value; }
    }

问题是,上面的xml和两个set方法上有两个断点,只有PROV的集合被调用,CAP的那个,没有!!!为什么?现在我真的快疯了……为什么会有这种行为??

Solution here.

【问题讨论】:

  • 你的课程不是我需要的解决方案。请好好学习wcf。
  • 您要我做些小改动还是可以做?
  • 我不明白你的意思..让我看看!
  • @jdweng 感谢您的支持,但是,正如您所见,解决方案与您的想法不同。

标签: c# xml wcf iis post


【解决方案1】:

这与 XML 中字段的顺序有关。这听起来很奇怪,但是 WCF DataContractSerializer 对 XML 中遇到字段的顺序确实很挑剔,但更糟糕的是,与它们在代码中的定义方式相比

你看,序列化器希望字段按字母顺序定义,如果你序列化你的类的一个实例,你会发现生成的 XML 字段是按字母顺序排列的。但是,在反序列化时,序列化程序会发现要反序列化的类型具有以“错误”顺序定义的字段。在这种情况下,行为似乎是随机的,但我认为这与 CAP 应该是遇到的第一个字段,而 PROV 应该是最后一个字段(按字母顺序)这一事实有关。

所以你有两个选择:

  1. 按照字母顺序重新排列您的 XML 和类中的字段,或者

  2. 使用 DataMemeber 属性装饰您的类成员,并定义序列化顺序。

你可以这样做2:

[DataContract]
public class WrapClienti
{ 
    [DataMember(Order=1)]
    public string CAP { get; set; } 

    [DataMember(Order=2)]
    public string PROV { get; set; } 

    ...etc
}

【讨论】:

  • 所以,不管怎样,xml 顺序是固定的。我按字母顺序排列了我的 xml,它可以工作!!!伙计,谢谢!只有一个问题:如果我有一些空白字段,没有值,我应该将其写为空还是可以跳过它??
  • 老实说我不确定,但我认为如果它只是空的并且您不需要定义明确的空值,那么您可以跳过它们。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2012-12-20
  • 2021-07-08
  • 2019-06-14
相关资源
最近更新 更多