我通过HttpPost接收XML到我的服务,我想记录接收的值以进行调试。
首先,我将其反序列化为这样的实体:
XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
TransactionResults t = (TransactionResults)s.Deserialize(stream);
当然,这会将流移动到最后,因此我无法记录原始值。
我尝试在开始时使用StreamReader
读取它,但它会抛出NotSupportedException
作为测试,我尝试重新序列化(我再次创建所有对象以避免重新使用它们以查看是否存在问题)
private static string GetContents(TransactionResults t)
{
XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
MemoryStream stream = new MemoryStream();
s.Serialize(stream, t);
return new StreamReader(stream).ReadToEnd();
}
此方法返回一个空字符串。
(显然,如果我反转逻辑,则会记录该值,但是我无法获取该对象)
我做错了什么?将值反序列化为对象的最佳方法和将其记录为字符串?
答案 0 :(得分:4)
您应该能够在没有问题的情况下寻找MemoryStream
的开头:
private static string GetContents(TransactionResults t)
{
XmlSerializer s = new XmlSerializer(typeof(TransactionResults));
MemoryStream stream = new MemoryStream();
s.Serialize(stream, t);
stream.Position = 0; // Rewind to the beginning of the stream
return new StreamReader(stream).ReadToEnd();
}
如果您想要记录原始数据,您实际上需要将其复制到MemoryStream
开始 - 然后您可以根据需要随时回放它。
我发现让这样的方法耗尽一个流,写入另一个流是很有用的:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
您可以将传入服务的输入流作为输入,并将新的MemoryStream
称为输出。
答案 1 :(得分:0)
将流读入内存流并对其进行操作,它支持搜索。
答案 2 :(得分:0)
当我需要从XML可序列化对象获取Xml字符串时,这是我使用的方法。所以你首先反序列化对象,然后从对象中获取字符串,现在你将拥有字符串和原始对象。
public static string ToXmlString(object xmlObject)
{
if (xmlObject == null)
throw new NullReferenceException("xmlObject cannot be null.");
String xmlResult = null;
XmlSerializer serializer = new XmlSerializer(xmlObject.GetType());
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, xmlObject);
xmlResult = writer.ToString();
}
return xmlResult;
}