xmlwcf POST请求:读取一些参数,其他不读取
本文关键字:读取 参数 其他 POST 请求 xmlwcf | 更新日期: 2023-09-27 18:01:16
我在IIS服务器上有一个wcf restful服务。
我做了一些API,可以调用发送xml或json。
我已经制作了我的c#类,然后我正在测试它。与JSON是完美的,但我仍然有一些问题与XML请求。
我想发送带有post的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"answers"hashhedstring",但"dati"是空的(0个元素),而我希望它已经得到了"wrapClienti"对象我发送。>
[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的一些属性,以及其他…是空! !
我的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集,不调用!!为什么?现在我真的要疯了……为什么会有这种行为?
解决方案。
罢工>这与XML中字段的排序有关。这听起来很奇怪,但是WCF DataContractSerializer确实对XML中遇到字段的顺序很挑剔,但更糟糕的是,与代码中的定义方式相比,也是如此。
您看,序列化器希望按字母顺序定义字段,如果序列化类的实例,您会发现生成的XML字段是按字母顺序定义的。但是,在反序列化时,序列化程序发现要反序列化到的类型的字段定义顺序是"错误的"。在这种情况下,这种行为似乎是随机的,但我认为这与CAP应该是遇到的第一个字段,而PROV应该是按字母顺序排列的最后一个字段有关。
你有两个选择:
-
按字母顺序重新排序XML和类中的字段,或者
-
用DataMemeber属性装饰你的类成员,并定义序列化的顺序。
你可以这样做:
[DataContract]
public class WrapClienti
{
[DataMember(Order=1)]
public string CAP { get; set; }
[DataMember(Order=2)]
public string PROV { get; set; }
...etc
}