繁体   English   中英

如何将对象序列化为原始XML

[英]How to serialize an object to a raw XML

背景 :我正在研究此集成解决方案,在该解决方案中,我必须使用自定义故障合同来实现WCF服务(BizTalk)。 故障消息应如下所示:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode>002</faultcode>
         <faultstring>some fault</faultstring>
         <detail>
               <wor:invalidMessageFault xmlns:wor="somenamespace">
                  <faultCode>002</faultCode>
                  <faultReference>Client WebService</faultReference>
                  <faultText>some fault</faultText>
               </wor:invalidMessageFault>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

到目前为止:我已经创建了一个自定义的故障检查器,以拦截故障消息并发回故障。

问题:我需要构造故障消息的<detail>部分,据我所知,唯一的方法是将原始xml转储到其中,因为在故障消息构造中,

var faultException = new FaultException<RawXMLString>(raw, fault.faultText, new FaultCode(fault.faultCode)).CreateMessageFault();

它只接受一个对象(可以序列化)作为详细信息,我尝试了不同的方法,但是可以使用对象构造相同的消息。

最后,我想到了使用自定义序列化生成确切的消息,

public class RawXMLString : IXmlSerializable
{
    private string xmlTemplate = @"<wor:invalidMessageFault xmlns:wor="some namespace">
          <faultCode>{0}</faultCode>
          <faultReference>Client WebService</faultReference>
          <faultText>{1}</faultText>
        </wor:invalidMessageFault>";

    public string FaultCode { get; set; }

    public string FaultText { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteRaw(string.Format(xmlTemplate,FaultCode,FaultText));
    }
}

现在还有另一个问题,因为我不想使用<RawXMLString>标记,是否有任何方法可以强制序列化程序忽略根?

这符合要求吗?

[XmlRoot(Namespace = "somenamespace",
 ElementName = "invalidMessageFault")]
public class InvalidMessageFault : IXmlSerializable
{
    public string FaultCode { get; set; }

    public string FaultText { get; set; }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("faultCode", FaultCode);
        writer.WriteElementString("faultReference", "Client WebService");
        writer.WriteElementString("faultText", FaultText);
    }
}

将代码更改为:

[XmlRoot("wor:invalidMessageFault xmlns:wor=\"some namespace\"")]
public class RawXMLString : IXmlSerializable
{
    private string xmlTemplate = @"<faultCode>{0}</faultCode>
      <faultReference>Client WebService</faultReference>
      <faultText>{1}</faultText>";

    public string FaultCode { get; set; }

    public string FaultText { get; set; }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteRaw(string.Format(xmlTemplate,FaultCode,FaultText));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM