Как передать потоковый XML-документ в виде вложения на сайт MVP asp.net - PullRequest
3 голосов
/ 12 мая 2010

Я думал, что MVC должен был сделать все это проще, но я пробую разные способы и получаю проблемы.

Если я попробую принять принятый ответ на этот вопрос (соответственно изменив тип контента) ... Как создать файл и вернуть его через FileResult в ASP.NET MVC?

... У меня проблемы, потому что моя кодировка в файле xml - UTF-16.

Я получаю ошибку:

Переключение с текущей кодировки на указанную кодировку не поддерживается.

Это говорит о том, что где-то мне нужно сказать MVC, что я хочу UTF-16. В качестве альтернативы я хочу другой метод, который использует двоичный файл, а не текст.

Ответы [ 2 ]

4 голосов
/ 13 мая 2010

Я согласился на это:

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.

Однако, похоже, это делает работу.

2 голосов
/ 01 июня 2012
    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 форматируется вместо того, чтобы быть строкой в ​​одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...