代码之家  ›  专栏  ›  技术社区  ›  Chris Simpson

如何在ASP.NET MVC站点上将内存中的XML文档作为附件进行流式处理

  •  2
  • Chris Simpson  · 技术社区  · 15 年前

    我以为MVC应该让这一切变得更容易,但我正在尝试各种方法,并遇到问题。

    如果我尝试接受此问题的答案(相应地更改内容类型)… How to create file and return it via FileResult in ASP.NET MVC?

    …我遇到了麻烦,因为我在XML文件中的编码是UTF-16。

    我得到的错误是:

    不支持从当前编码切换到指定编码。

    这意味着在某个地方我需要告诉MVC我想要UTF-16。另外,我想要一个使用二进制而不是文本的不同方法。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Chris Simpson    15 年前

    这就是我的目标:

    public FileStreamResult DownloadXML()
    {
        string name = "file.xml";
        XmlDocument doc = getMyXML();
        System.Text.Encoding enc = System.Text.Encoding.Unicode;
        MemoryStream str = new MemoryStream(enc.GetBytes(doc.OuterXml));
    
        return File(str, "text/xml", name);
    }
    

    我不认为这是完美的,我可能只需要使用一个fileContentResult,而不用担心内存流。另外,我觉得我不喜欢Unicode。它抱怨说“一个名字是以一个无效字符开始的”,尽管XML在火狐中很好地打开了。

    不过,这似乎起到了作用。

        2
  •  2
  •   Roman Asanov    13 年前
        public FileStreamResult DownloadXML()
        {
            string name = "file.xml";
            XmlDocument doc = getMyXML();
            var str = new MemoryStream();
            doc.Save(str);
            str.Flush();
            str.Position = 0;
    
            return File(str, "text/xml", name);
        }
    

    注意,调用flush和setting position是必须做的事情。

    保存到流比通过outerxml初始化效果更好:1)减少摩擦,2)将生成的xml格式化,而不是一行字符串。