如何将内存中的xml文档作为附件在asp.net mvc站点上流式传输

时间:2010-05-12 19:05:29

标签: asp.net-mvc xml streaming

我认为MVC应该让这一切变得更容易,但我正在尝试各种方式并获得问题。

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

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

我得到的错误是:

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

这表明在某个地方我需要告诉MVC我想要UTF-16。或者,我想要一个使用二进制而不是文本的不同方法。

2 个答案:

答案 0 :(得分:4)

这是我已经解决的问题:

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而不打扰内存流。另外,我不认为IE喜欢unicode。它抱怨“一个名字是以一个无效的字符开始的”尽管xml很好并且很高兴在firefox中打开。

然而它似乎可以完成这项工作。

答案 1 :(得分:2)

    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并设置Position是必须要做的事情。

保存到流比通过OuterXml初始化更好:1)更少的摩擦,2)格式化XML而不是单行字符串。