142 votes

Quel est le meilleur moyen de renvoyer XML à partir de l'action d'un contrôleur dans ASP.NET MVC?

Quel est le meilleur moyen de renvoyer XML à partir de l'action d'un contrôleur dans ASP.NET MVC? Il existe un bon moyen de renvoyer JSON, mais pas pour XML. Dois-je vraiment acheminer le code XML à travers une vue ou dois-je utiliser la méthode de réponse qui n'est pas la meilleure pratique?

139voto

Petr Points 953
return this.Content(xmlString, "text/xml");

1 votes

W

0 votes

I b .

2 votes

@

115voto

Luke Smith Points 4335

Utilice MVCContrib de l'action XmlResult.

Pour référence, voici leur code :

public class XmlResult : ActionResult
{
    private object objectToSerialize;

    /// <summary>
    /// Initializes a new instance of the <see cref="XmlResult"/> class.
    /// </summary>
    /// <param name="objectToSerialize">The object to serialize to XML.</param>
    public XmlResult(object objectToSerialize)
    {
        this.objectToSerialize = objectToSerialize;
    }

    /// <summary>
    /// Gets the object to be serialized to XML.
    /// </summary>
    public object ObjectToSerialize
    {
        get { return this.objectToSerialize; }
    }

    /// <summary>
    /// Serialises the object that was passed into the constructor to XML and writes the corresponding XML to the result stream.
    /// </summary>
    /// <param name="context">The controller context for the current request.</param>
    public override void ExecuteResult(ControllerContext context)
    {
        if (this.objectToSerialize != null)
        {
            context.HttpContext.Response.Clear();
            var xs = new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType());
            context.HttpContext.Response.ContentType = "text/xml";
            xs.Serialize(context.HttpContext.Response.Output, this.objectToSerialize);
        }
    }
}

13 votes

La classe présentée ici est tirée directement du projet MVC Contrib. Je ne sais pas si c'est ce que l'on peut qualifier de "rolling your own".

3 votes

Où placer cette classe, si vous suivez la convention ASP.NET MVC ? Dans le dossier des contrôleurs ? Au même endroit que les ViewModels, peut-être ?

7 votes

@pcampbel, je préfère créer des dossiers séparés dans mon projet Root pour chaque type de classe : Résultats, Filtres, Routage, etc.

32voto

Drew Noakes Points 69288

Si vous construisez le XML à l'aide de l'excellent cadre Linq-to-XML, cette approche vous sera utile.

Je crée un XDocument dans la méthode d'action.

public ActionResult MyXmlAction()
{
    // Create your own XDocument according to your requirements
    var xml = new XDocument(
        new XElement("root",
            new XAttribute("version", "2.0"),
            new XElement("child", "Hello World!")));

    return new XmlActionResult(xml);
}

Ce produit réutilisable et personnalisé ActionResult sérialise le XML pour vous.

public sealed class XmlActionResult : ActionResult
{
    private readonly XDocument _document;

    public Formatting Formatting { get; set; }
    public string MimeType { get; set; }

    public XmlActionResult(XDocument document)
    {
        if (document == null)
            throw new ArgumentNullException("document");

        _document = document;

        // Default values
        MimeType = "text/xml";
        Formatting = Formatting.None;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.ContentType = MimeType;

        using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, Encoding.UTF8) { Formatting = Formatting })
            _document.WriteTo(writer);
    }
}

Vous pouvez spécifier un type MIME (tel que application/rss+xml ) et si la sortie doit être indentée si nécessaire. Ces deux propriétés ont des valeurs par défaut raisonnables.

Si vous avez besoin d'un encodage autre que UTF8, il est simple d'ajouter une propriété pour cela aussi.

0 votes

Pensez-vous qu'il soit possible de le modifier pour l'utiliser dans un contrôleur d'API ?

0 votes

@RayAckley, je ne sais pas car je n'ai pas encore essayé la nouvelle API Web. Si vous le découvrez, faites-le nous savoir.

0 votes

Je pense que j'étais sur la mauvaise voie avec la question du contrôleur API (je ne fais normalement pas de trucs MVC). Je l'ai simplement implémenté comme un contrôleur normal et cela a très bien fonctionné.

27voto

Erik Points 197

Si vous souhaitez uniquement renvoyer du xml par le biais d'une requête, et que vous avez votre "morceau" de xml, vous pouvez simplement le faire (en tant qu'action dans votre contrôleur) :

public string Xml()
{
    Response.ContentType = "text/xml";
    return yourXmlChunk;
}

17voto

Mahdi Points 579

Il existe un XmlResult (et bien plus encore) dans MVC Contrib. Jetez un coup d'œil à http://www.codeplex.com/MVCContrib

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X