J'ai rencontré beaucoup de demi-solutions pour le retour de XML dans ASP.Net. Je ne veux pas aveuglément copier-coller du code qui arrive à travailler la plupart du temps, cependant, je veux le droit de code, et je veux savoir pourquoi c'est bon. Je veux de la critique; j'ai besoin de renseignements, je veux savoir, je veux comprendre.
Ci-dessous sont des fragments de code, par ordre de complexité croissante, qui représente certains des solutions partielles que j'ai vu, y compris quelques-unes des autres questions que chacun causes, et sur laquelle j'aimerais avoir une réponse ici.
Approfondie de la réponse doit répondre à pourquoi nous devons avoir ou ne doit pas avoir les choses suivantes, ou expliquer pourquoi il n'est pas pertinent.
- Réponse.Clear();
- Réponse.ContentType = "text/xml";
- Réponse.ContentEncoding = Encodage.UTF8;
- Réponse.ContentEncoding = Encodage.UTF16;
- Réponse.ContentType = "text/xml; charset=utf-8";
- Réponse.ContentType = "text/xml; charset=utf-16";
- Réponse.Fin()
- À l'aide d'un aspx avec l'avant-fichier tripes arrachées
- À l'aide d'un fichier ashx
En fin de compte, imaginez que vous avez besoin pour écrire le contenu d'une aide de la fonction comme ceci:
///<summary>Use this call inside your (Page_Xxx) method to write the
///xml to the web client. </summary>
///<remarks>See for http://stackoverflow.com/questions/543319/how-to-return-xml-in-asp-net
///for proper usage.</remarks>
public static void ReturnXmlDocumentToWebClient(
XmlDocument document,
Page page)
{
...
}
Chaque solution que je vois commence avec la prise de vide d'une page aspx, et de tailler tout le HTML de l'avant du fichier (ce qui provoque des avertissements dans Visual Studio):
<%@ Page Language="C#"
AutoEventWireup="true"
CodeFile="GetTheXml.aspx.cs"
Inherits="GetTheXml" %>
Ensuite, nous utilisons l' Page_Load
événement à écrire à la sortie:
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Write(xml);
}
Devons-nous modifier le ContentType à "text/xml"? I. e.:
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.ContentType = "text/xml";
Response.Write(xml);
}
Devons-nous appeler Response.Clear
premier?
protected void Page_Load(object sender, EventArgs e)
{
String xml = "<foo>Hello, world!</foo>";
Response.Clear();
Response.ContentType = "text/xml";
Response.Write(xml);
}
Avons-nous vraiment besoin d'appeler qui? N'a pas d' Response.Clear
faire l'étape préalable de s'assurer que le code dans le fichier était vide (même pas un espace ou un retour chariot) à l'extérieur de l' <% ... %>
inutile?
N' Response.Clear
la rendre plus solide, dans le cas où quelqu'un a laissé une ligne vide ou un espace dans le code du front de fichier?
Est l'aide de ashx la même chose qu'un vide aspx fichier principal, car il est entendu qu'il ne va pas à la sortie de l'HTML?
Devons-nous appeler Response.End
? I. e.:
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();
}
Quoi d'autre pourrait éventuellement se produire après l' Response.Write
qui a besoin de nous pour mettre fin à la réponse de la droite maintenant?
Est le content-type text/xml suffisant, ou faut-il plutôt 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();
}
Ou faut-il précisément de ne pas être qui? Le fait d'avoir un jeu de caractères dans le type de contenu, mais pas la définition de la propriété, revissez le serveur?
Pourquoi pas sur un autre type de contenu, par exemple:
- UTF-8
- utf-16
- UTF-16
Si le charset être spécifié en 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();
}
Est l'aide de Response.ContentEncoding
de mieux que de brouillage en Response.ContentType
? Est-ce pire? C'est l'ancienne pris en charge? Est le dernier?
Je n'ai pas vraiment envie d'écrire une Chaîne de caractères; je veux écrire un XmlDocument
. Quelqu'un suggère que je peux utiliser l' 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?
}
}
Notez l'utilisation de l' Response.OutputStream
, plutôt que d' Response.Write
. Est-ce bien? Mauvaise? Mieux? Le pire? Plus vite? Plus lent? Plus de mémoire intensive? Moins gourmande en mémoire?
J'ai lu que vous devez rendre
le XML de la page de la méthode Render() pour éviter les problèmes de segmentation rencontrés lors de l'utilisation Page_Load().
Qu'est-ce que chunking?
Quels sont les problèmes de segmentation, et comment utiliser l'aide d' Page_Render
les éliminer?
Je ne veux pas écrire le contenu de mon XmlDocument
objet en chaîne de caractères, puis d'écrire que parce que les déchets de la mémoire. C'est l'un de ces serait mauvais:
Response.Write(doc.ToString());
Response.Write(doc.InnerXml);
xmlWrite.WriteString(doc.ToString());
xmlWrite.WriteString(doc.InnerXml);
Des Questions Similaires
Comment renvoyer du XML dans ASP.NET
Références
Comment Renvoyer du XML à Partir ASPX dans ASP.NET 1.1
L'écriture xml de sortie à l'asp .net page web