我正在通过 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();
}
此方法返回一个空字符串。
(显然,如果我颠倒逻辑,值会被记录下来,但我无法获取对象)
我做错了什么?将值反序列化为对象并将其记录为字符串的最佳方法是什么?
最佳答案
您应该能够毫无问题地寻找到 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
作为输出来调用。
关于c# - Streams 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3133377/