代码之家  ›  专栏  ›  技术社区  ›  Balázs Varga

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

  •  1
  • Balázs Varga  · 技术社区  · 7 年前

    我需要通过XML与Web服务通信。该服务正在使用saml:断言来验证连接。我可以与服务器通信,但验证总是失败。我花了几个小时搜索了问题所在,因为当我使用参数完全相同的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 回复  |  直到 7 年前
        1
  •  0
  •   Balázs Varga    7 年前

    // 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);
        }
    }