C# “很多意想不到的事”;nul";带有MemoryStream的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

我编写了一个操作,让用户下载生成的xml,而不必将其写入服务器磁盘,而是将其保存在内存中

这是我的密码:

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,这很可能意味着它的大小是需要的两倍,并且它也可能没有遵循它声称的编码。我不推荐这种方法