Я сталкивался со многими половинными решениями задачи возврата XML в ASP.NET. Однако я не хочу слепо копировать и вставлять код, который работает в большинстве случаев; Я хочу правильный код и хочу знать, почему он правильный. Я хочу критики; Я хочу информацию; Я хочу знания; Я хочу понимания.
Ниже приведены фрагменты кода в порядке возрастания сложности, представляющие некоторые частичные решения, которые я видел, включая некоторые дополнительные вопросы, которые вызывает каждый из них, и на которые я бы хотел ответить здесь.
Тщательный ответ должен касаться того, почему мы должны иметь или не иметь какой-либо из следующих вещей, или объяснять, почему это не имеет значения.
- Response.Clear();
- Response.ContentType = "text/xml";
- Response.ContentEncoding = Encoding.UTF8;
- Response.ContentEncoding = Encoding.UTF16;
- Response.ContentType = "text/xml; charset = utf-8";
- Response.ContentType = "text/xml; charset = utf-16";
- Response.End()
- Использование aspx с вырванными кишками переднего файла
- Использование файла Ashx
В конце представьте, что вам нужно написать содержимое вспомогательной функции, например так:
///<summary>Use this call inside your (Page_Xxx) method to write the
///xml to the web client. </summary>
///<remarks>See for https://stackoverflow.com/info/543319/how-to-return-xml-in-asp-net
///for proper usage.</remarks>
public static void ReturnXmlDocumentToWebClient(
XmlDocument document,
Page page)
{
...
}
Каждое решение, которое я вижу, начинается с удаления пустой страницы aspx и обрезки всего HTML-кода из переднего файла (что вызывает предупреждения в Visual Studio):
<%@ Page Language="C#"
AutoEventWireup="true"
CodeFile="GetTheXml.aspx.cs"
Inherits="GetTheXml" %>
Далее мы используем событие Page_Load
для записи в вывод:
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Write(xml);
}
Нужно ли нам менять ContentType на "text/xml"? То есть:
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.ContentType = "text/xml";
Response.Write(xml);
}
Нужно ли сначала вызывать Response.Clear
?
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Clear();
Response.ContentType = "text/xml";
Response.Write(xml);
}
Нам действительно нужно это так называть? Разве Response.Clear
не делает предыдущий шаг, чтобы убедиться, что код в переднем файле был пуст (даже без пробела или возврата каретки) за пределами <%... %>
ненужного?
Делает ли Response.Clear
его надежность, если кто-то оставил пустую строку или пробел в файле кода?
Является ли использование Ashx таким же, как пустой основной файл ASPX, потому что он понял, что он не будет выводить HTML?
Нужно ли нам вызывать Response.End
? То есть:
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Clear();
Response.ContentType = "text/xml";
Response.Write(xml);
Response.End();
}
Что еще может произойти после Response.Write
что нам нужно, чтобы закончить ответ прямо сейчас?
Является ли тип содержимого text/xml
достаточным или вместо него должен быть text/xml; charset = utf-8?
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Clear();
Response.ContentType = "text/xml; charset=utf-8";
Response.Write(xml);
Response.End();
}
Или это конкретно не должно быть? Имеет ли кодировка в типе контента, но не устанавливает свойство, испортить сервер?
Почему не какой-то другой тип контента, например:
- UTF-8,
- UTF-16
- UTF-16
Должна ли кодировка быть указана в Response.ContentEncoding
?
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Clear();
Response.ContentType = "text/xml";
Response.ContentEncoding = Encoding.UTF8;
Response.Write(xml);
Response.End();
}
Является ли использование Response.ContentEncoding
лучше, чем его вставка в Response.ContentType
? Это хуже? Поддерживается ли первое? Последний?
Я на самом деле не хочу писать строку; Я хочу написать XmlDocument
. Кто-то предлагает мне использовать XmlWriter
:
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument xml = GetXmlDocumentToShowTheUser();
Response.Clear();
Response.ContentType = "text/xml";
Response.ContentEncoding = Encoding.UTF8;
using (TextWriter textWriter = new StreamWriter(
Response.OutputStream,
Encoding.UTF8))
{
XmlTextWriter xmlWriter = new XmlTextWriter(textWriter);
// Write XML using xmlWriter
//TODO: How to do this?
}
}
Обратите внимание на использование Response.OutputStream
, а не Response.Write
. Это хорошо? Плохой? Лучше? Хуже? Быстрее? Помедленнее? Больше памяти? Меньше памяти?
Я прочитал, что вы должны сделать
XML в методе Render() страниц, чтобы избежать проблем с чанкингом, возникающими при использовании Page_Load().
Что такое чанкинг? Каковы проблемы с разбиением на фрагменты и как их использование с помощью Page_Render
устраняет их?
Я не хочу записывать содержимое моего объекта XmlDocument
в строку, а затем записывать это, потому что это тратит впустую память. То есть любой из них будет плох:
Response.Write(doc.ToString());
Response.Write(doc.InnerXml);
xmlWrite.WriteString(doc.ToString());
xmlWrite.WriteString(doc.InnerXml);
Подобные вопросы
Рекомендации
Как вернуть XML из ASPX в ASP.NET 1.1
Запись вывода XML на веб-страницу ASP.NET