C# “很多意想不到的事”;nul";带有MemoryStream的xml末尾的字符
我编写了一个操作,让用户下载生成的xml,而不必将其写入服务器磁盘,而是将其保存在内存中 这是我的密码:C# “很多意想不到的事”;nul";带有MemoryStream的xml末尾的字符,c#,asp.net-mvc,linq-to-xml,memorystream,filecontentresult,C#,Asp.net Mvc,Linq To Xml,Memorystream,Filecontentresult,我编写了一个操作,让用户下载生成的xml,而不必将其写入服务器磁盘,而是将其保存在内存中 这是我的密码: public FileContentResult MyAction() { MemoryStream myStream = new MemoryStream(); XDocument xml = GenerateXml(...); xml.Save(myStream ); myStream .Position = 0; return File(myStream.GetBu
public FileContentResult MyAction()
{
MemoryStream myStream = new MemoryStream();
XDocument xml = GenerateXml(...);
xml.Save(myStream );
myStream .Position = 0;
return File(myStream.GetBuffer(), "text/xml", "myFile.xml");
}
一切似乎都很正常,XML是正确的,我可以下载该文件,但我不明白为什么我的文件末尾有691920个“nul”字符(这些字符的数量似乎与XML的长度有关):
它们来自哪里?我怎样才能摆脱它们
[更新]
我试过这个:
public FileContentResult MyAction()
{
XDocument xml = GenerateXml(...);
byte[] bytes = new byte[xml.ToString().Length * sizeof(char)];
Buffer.BlockCopy(xml.ToString().ToCharArray(), 0, bytes, 0, bytes.Length);
return File(bytes, "text/xml", "myFile.xml");
}
我没有看到“nul”这个字。所以我想是MemoryStream在文件末尾添加了额外的字符。
在我的例子中,第二个代码解决了我的问题
但我也生成了一个我无法阅读的Word文档(xxx.docx无法打开,因为内容有问题)。
我想我这里也有同样的问题,内存流在文件末尾添加了额外的字符并损坏了它。问题是您正在调用
myStream.GetBuffer()
。该方法返回MemoryStream
使用的底层数组,包括不包含真实数据的任何“备用”部件。从文件中:
请注意,缓冲区包含可能未使用的已分配字节。例如,如果将字符串“test”写入MemoryStream对象,则从GetBuffer返回的缓冲区长度为256,而不是4,未使用252字节。要仅获取缓冲区中的数据,请使用ToArray方法;但是,ToArray会在内存中创建数据的副本
不要使用GetBuffer()
,而是使用-或使用流的长度来知道实际使用了多少缓冲区
请注意,在更新的代码中,您基本上是将字符串转换为UTF-16,这很可能意味着它的大小是需要的两倍,并且它也可能没有遵循它声称的编码。我不推荐这种方法