我需要通过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" />
如何摆脱这种行为?
答案 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);
}
}