如何使用XmlElement.InnerXml没有任何格式?

时间:2017-08-16 09:06:09

标签: c# xml formatting saml xmldocument

我需要通过XML与WebService进行通信。此服务使用saml:Assertion来验证连接。我可以与服务器通信,但验证总是失败。我搜索了几个小时的问题是什么,因为当我使用soapUI与完全相同的参数和saml票时,它的工作原理。我试图“手动”删除saml:Assertion中的任何格式,因为它已经签名,所以使用单字节更改,它将不再起作用。

这是我的代码:

// Insert saml:Assertion string into soapenv:Header
private static void InsertSAML(ref XmlDocument soapXML, ref XmlNamespaceManager nsmgr, string saml)
{
    // Remove all formatting
    saml = saml.Replace("\r", "");
    saml = saml.Replace("\n", "");
    while(saml.IndexOf("  ") > -1)
    {
        saml = saml.Replace("  ", " ");
    }
    saml = saml.Replace("> <", "><");
    saml = saml.Replace("\" />", "\"/>");

    XmlElement soapHeader = (XmlElement)soapXML.SelectSingleNode("//soapenv:Envelope/soapenv:Header/wsse:Security", nsmgr);
    if (soapHeader == null)
    {
        throw new Exception("Can't find \"//soapenv:Envelope/soapenv:Header/wsse:Security\"");
    }

    soapHeader.InnerXml += saml;
}

但似乎当我使用soapHeader.InnerXml += saml;时会导致某种格式化。在没有内容的元素的结束标记之前会出现一个空格:

所以,我需要补充一下:

<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>

但是在最终的XML看起来像这样,即使我在插入之前替换了这些出现:

<dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />

如何摆脱这种行为?

1 个答案:

答案 0 :(得分:0)

正如我所说,问题是当我将内容附加到InnerXml时,我的xml中添加了额外的字节XmlDocument。我努力删除所有格式,这是一个很好的方向。但不是&#34;取消格式化&#34; saml:断言部分,我在整个请求主体发送到服务之前进行了格式化。现在它有效。我在发送请求之前就调用了这个方法:

// Insert XML to request body
private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
{
    using (var stringWriter = new StringWriter())
    using (var xmlTextWriter = XmlWriter.Create(stringWriter))
    using (Stream stream = webRequest.GetRequestStream())
    {
        // Get XML contents as string
        soapEnvelopeXml.WriteTo(xmlTextWriter);
        xmlTextWriter.Flush();
        string str = stringWriter.GetStringBuilder().ToString();

        // Remove all formatting
        str = str.Replace("\r", "");
        str = str.Replace("\n", "");
        while (str.IndexOf("  ") > -1)
        {
            str = str.Replace("  ", " ");
        }
        str = str.Replace("> <", "><");
        str = str.Replace("\" />", "\"/>");

        // Write the unbeutified text to the request stream
        MemoryStream ms = new MemoryStream(UTF8Encoding.Default.GetBytes(str));
        ms.WriteTo(stream);
    }
}