Почему ASP.net записывает пробелы в конце вывода из моего файла ASHX? - PullRequest
1 голос
/ 14 июня 2011

Я написал универсальный обработчик ASHX для вывода XML.Однако по какой-то причине ASP.net добавляет множество пробельных символов в конец выходных данных, что нарушает XML.

Мой код выглядит следующим образом:

context.Response.ContentType = "текст / XML ";

        XmlSerializer oSerializer = new XmlSerializer(typeof(ModelXml[]),new XmlRootAttribute("rows"));
        System.IO.MemoryStream ms2 = new System.IO.MemoryStream();
        System.Xml.XmlTextWriter tw = new System.Xml.XmlTextWriter(ms2,new System.Text.UTF8Encoding());
        oSerializer.Serialize(tw,models);
        string s = System.Text.Encoding.UTF8.GetString(ms2.GetBuffer());
        tw.Close();
        ms2.Close();

        context.Response.Write(s.Trim());
        context.Response.End();

Когда я запускаю этот код через отладчик, я вижу, что строка s действительно содержит данные XML без БЕЛОГО ПРОСТРАНСТВА.Однако, когда я указываю Internet Explorer на этот файл, я получаю следующую ошибку:

The XML page cannot be displayed 
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later. 

--------------------------------------------------------------------------------

Invalid at the top level of the document. Error processing resource 'http://localhost:5791/XXXXX.ashx'. 

Когда я просматриваю источник страницы в Блокноте, я вижу, что файл начинается с правильного XML, но есть многочисленныепробелы добавлены до конца.Если я удаляю эти пробелы, файл XML отлично работает с моим браузером и приложениями.

Почему ASP.net добавляет эти пробелы в мой вывод и что я могу с этим сделать?

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Переключение с MS2.GetBuffer () на MS2.ToArray ().Вы читаете буфер из MemoryStream, который предварительно выделен для эффективности.Вам нужны только используемые данные, а не весь буфер.

0 голосов
/ 14 июня 2011

Вместо сериализации в MemoryStream, вы должны сериализировать напрямую в Response.Output.
Это должно решить проблему.

...