【发布时间】:2017-05-10 16:28:52
【问题描述】:
我在这个问题上花费了无数个小时,并且尝试了很多不同的东西。一些背景... 我正在使用 C# 代码在 SSIS 模块中工作,以尝试反序列化 SOAP XML 流。我之前已经能够反序列化 XML 流,但是这个比我之前参与的要复杂得多。
我已经验证我用来填充我的流的字符串对于结果是正确的,我已经走到了尽头。
这是我用来尝试反序列化的方法。你可以看到我已经包含了几个注释掉的部分,以展示我用来尝试完成这项工作的一些其他方法:
private Envelope GetWebServiceResultFromStream(StreamReader str)
{
bool b = true;
Envelope xmlResponse = null;
String xmlPayload = "";
//Deserialize our XML
try
{
//System.Runtime.Serialization.Formatters.Soap.SoapFormatter soapFormatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
//using (Stream savestream = str.BaseStream)
//{
// xmlResponse = (Envelope)soapFormatter.Deserialize(savestream);
//}
System.Xml.Serialization.XmlSerializer sr = new System.Xml.Serialization.XmlSerializer(typeof(Envelope));
using (Stream savestream = str.BaseStream)
{
StreamReader streamreader = new StreamReader(savestream, Encoding.UTF8);
xmlPayload = streamreader.ReadToEnd();
//xmlPayload = System.Security.SecurityElement.Escape(xmlPayload);
//xmlPayload = xmlPayload.Replace("&", "&");
//xmlPayload = xmlPayload.Replace("&", "&");
xmlPayload = xmlPayload.Replace("'", "'");
//xmlPayload = xmlPayload.Replace("soap:Envelope", "Envelope");
File.WriteAllText(@"myxml.xml",xmlPayload);
byte[] byteArray = Encoding.UTF8.GetBytes(xmlPayload);
MemoryStream secondstream = new MemoryStream(byteArray);
secondstream.Position = 0;
xmlResponse = sr.Deserialize(secondstream) as Envelope;
//xmlResponse = (Envelope)DeserializeFromXml<Envelope>(xmlPayload);
//XmlDocument doc = new XmlDocument();
//doc.Load(secondstream);
//XmlNodeReader reader = new XmlNodeReader(doc);
//using (reader)
//{
// xmlResponse = sr.Deserialize(reader) as Envelope;
//}
//System.Runtime.Serialization.Formatters.Soap.SoapFormatter soapFormatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
//xmlResponse = (Envelope)soapFormatter.Deserialize(secondstream);
}
//XmlDocument xmlSoapRequest = new XmlDocument();
//using (Stream savestream = str.BaseStream)
//{
// using (StreamReader readStream = new StreamReader(savestream, Encoding.UTF8))
// {
// xmlSoapRequest.Load(readStream);
// xmlPayload = xmlSoapRequest.SelectSingleNode("//Envelope/Body/GetRequisitionByDateResponse/").InnerText;
// }
//}
}
catch (Exception ex)
{
DumpException(ex);
this.ComponentMetaData.FireInformation(54, "", "Failed to deserialize: " + ex.Message + " Inner: " + ex.InnerException + " Source: " + ex.Source, "", 43, ref b);
}
return xmlResponse;
}
public static T DeserializeFromXml<T>(string xml)
{
T result;
var ser = new XmlSerializer(typeof(T));
using (var tr = new StringReader(xml))
{
result = (T)ser.Deserialize(tr);
}
return result;
}
我正在使用通过将响应提供给 XML 到 C# 转换器 (http://xmltocsharp.azurewebsites.net/) 生成的 c# 类。不幸的是,这些类似乎太复杂了,无法放在这里(帖子有 30k 字符限制),所以它被粘贴在这里: http://txt.do/d91eo
我还粘贴了一个示例响应: http://txt.do/d91eb
我咨询了 wsdl,似乎许多 DateTime 字段正在通过转换器读取为字符串。我不确定这是否是个问题,但我已尽力替换这些数据类型,但错误仍然存在。
这是我的错误截图: http://imgur.com/a/objJq
我尝试过的其他事情:
替换整个 xml 文档中的无效字符(我发现它已经在这样做了,除了某些“'”字符)。
已移除命名空间。
将所有类标记为可序列化。
SSIS 中的 Web 服务对象(引发错误并且不允许我输入任何要发送的变量)。
使用返回结果的许多变体重新生成类列表。
【问题讨论】:
标签: c# xml soap ssis deserialization