我试图调用一个SOAP服务,据信是用Java编写的,它以十进制为值。该合同由.NET 4.6.1 System.ServiceModel生成。对于被调用的服务有些奇怪,有必要发送10.00 vs 10.0。我能够将“10.00”作为字符串发送,但是如果需要重新生成则不想修改合同。合同是一个公共的部分类,我实现了从IXmlSerializable部分继承,其中十进制转换为带有两个小数位的字符串。但是,通过此代码运行测试时会生成以下错误:
... “exceptionMessage \\”:\\“只能为其指定XmlRoot属性 MyPainfulClass类型。请使用XmlSchemaProviderAttribute 指定架构 输入\\ “\\ ”exceptionType \\“:\\ ”System.InvalidOperationException \\“,\\ ”堆栈跟踪\\“:\\” 在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model,String ns,ImportContext context,String dataType, XmlAttributes a,Boolean repeats,Boolean openModel,RecursionLimiter 限制器)\\ “}}}}}}}}}}}}}} \”}“
这似乎是John在this post中推荐的解决方案。
我确实使用XmlSchemaProviderAttribute修饰了扩展类,但我不确定我是否引用了正确的.xsd作为服务相当纠结。是否有更好的方法来为模式生成的类进行deffer?我的最终目标是简单地将XML序列化覆盖为字符串。
namespace PainfulService.Contract
{
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
[XmlSchemaProviderAttribute("http://painfulservice.com/headache/v1_01.xsd")]
public partial class MyPainfulClass : IXmlSerializable
{
[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public string PriceAsString
{
get
{
return this.priceField.ToString("0.00");
}
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
Price = decimal.Parse(element.XPathSelectElement("PriceAsString").Value);
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("Price", PriceAsString);
}
}
}