无法以编程方式反序列化SOAP消息
|
当我尝试反序列化肥皂消息时,出现以下异常。我这样做是因为我有要在测试中重用的响应文件。我不能使用真实的服务或类似服务,因为它不适合我们拥有的测试框架的体系结构。
Test \'MyUnitTestMethod\' failed: System.InvalidOperationException : There is an error in XML document (1, 2).
----> System.InvalidOperationException : <MySpecialResponse xmlns=\'http://xsd.com/msgs/v1\'> was not expected.
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream)
private const string _content =
@\"<soapenv:Envelope xmlns:soapenv=\"\"http://schemas.xmlsoap.org/soap/envelope/\"\">
<soapenv:Body>
<ns3:MySpecialResponse xmlns:ns3=\"\"http://xsd.com/msgs/v1\"\" >
<header>
<status>0</status>
</header>
<ns3:Payload>
<ns3:CustomerName>name</ns3:CustomerName>
<ns3:EmailAddress>test1@mail.com</ns3:EmailAddress>
</ns3:Payload>
</ns3:MySpecialResponse>
</soapenv:Body>
</soapenv:Envelope>\";
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Xml\", \"2.0.50727.3082\")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(\"code\")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace=\"http://xsd.com/msgs/v1\")]
public partial class MySpecialResponse : BaseResponse {
private MySpecialPayload payloadField;
/// <remarks/>
public MySpecialPayload Payload {
get {
return this.payloadField;
}
set {
this.payloadField;= value;
}
}
}
[System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Xml\", \"2.0.50727.3082\")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(\"code\")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace=\"http://xsd.com/msgs/v1\")]
public partial class MySpecialPayload {
private string customerNameField;
private string emailAddressField;
/// <remarks/>
public string CustomerName {
get {
return this.customerNameField;
}
set {
this.customerNameField = value;
}
}
/// <remarks/>
public string EmailAddress {
get {
return this.emailAddressField;
}
set {
this.emailAddressField = value;
}
}
}
//The code I am using - might not be right?
var serialiser = new System.Xml.Serialization.XmlSerializer(typeof(MySpecialResponse));
using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(_content))
{
var doc = new System.Xml.XmlDocument();
doc.Load(stream);
var nsManager = new System.Xml.XmlNamespaceManager(doc.NameTable);
nsManager.AddNamespace(\"soapenv\", \"http://schemas.xmlsoap.org/soap/envelope/\");
//so I can get the actual response and not the soap body
var node = doc.SelectSingleNode(\"//soapenv:Body\", nsManager);
if (node != null)
{
byte[] xml = Encoding.UTF8.GetBytes(node.InnerXml);
using (var memStream = new System.IO.MemoryStream(xml))
{
memStream.Position = 0;
var resp = (MySpecialResponse)serialiser.Deserialize(memStream); //Throws exception here
}
}
}
(BaseResponse具有标题字段)
我提出了例外的任何想法,以及如何获取肥皂消息以将消息反序列化为对象,无论是修复我的代码还是应用其他技术。
注意:我有许多文件想要使用反序列化的通用方法,因此我不会提前知道所有xml名称空间,而只知道根响应类型。
谢谢
没有找到相关结果
已邀请:
1 个回复
剿畦缄饥小