ASP.NET MVC5のアクションメソッドでXMLを返却する

こんにちは。beaglesoftの真鍋です。

DHTMLXを利用していると、Ajaxによるデータの連携を画面と頻繁に実施します。たとえばdhtmlXGridではグリッドのデータを取得するときにXMLやJSONまたはCSVでデータの連携が可能です。

DHTMLXのバージョンが古い頃はXMLでのみ連携可能だったせいか、JSONでデータの連携を実行すると上手く動作しないことやそもそもJSONデータの形式が独自フォーマットでないとXMLと同等のことができないケースがあり、未だにXMLを利用します。

ところが、ASP.NET MVC5ではアクションメソッドとしてXMLを返却する方法がありませんでした。最近はJSONが主流なので特に必要ないことの方が多いのかもしれません。しかし、必要なこともあるのです。

ということで、海外のサイトを参考に以下のような感じでアクションメソッドの処理結果をXMLで返却する処理を実装しました。

サンプルの全体はGitHubからダウンロードできます

yoichiro-manabe/SampleApps: ASP.NET MVC5でアクションメソッドの処理結果をXMLで返却するサンプル

具体的な実装

具体的な実装は下記の通りActionResultを継承したXmlResultを実装しています。

// XmlResult.cs

using System.Web.Mvc;
using System.Xml.Serialization;

namespace SampleApps.Controllers.Results
{
    public class XmlResult : ActionResult
    {
        public XmlResult(object objectToSerialize)
        {
            ObjectToSerialize = objectToSerialize;
        }

        public object ObjectToSerialize { get; }

        public override void ExecuteResult(ControllerContext context)
        {
            if (ObjectToSerialize != null)
            {
                context.HttpContext.Response.Clear();
                var xs = new XmlSerializer(ObjectToSerialize.GetType());
                context.HttpContext.Response.ContentType = "text/xml";

                var xmlnsEmpty = new XmlSerializerNamespaces();
                xmlnsEmpty.Add("", "");
                xs.Serialize(context.HttpContext.Response.Output, ObjectToSerialize, xmlnsEmpty);
            }
        }
    }
}

ここでは、以前まとめた内容も反映されていたりします。

blog.beaglesoft.net

コントローラーではXMLとして生成するオブジェクトをXmlResultのコンストラクタで渡すだけでレスポンスとしてXMLを返却してくれます。

// HomeController.cs

public ActionResult SampleXml()
{
    var samples = new SampleRoot();

    var sample1 = new Sample
    {
        Id = 1,
        Name = "サンプル1"
    };
    samples.Samples.Add(sample1);

    var sample2 = new Sample
    {
        Id = 2,
        Name = "サンプル2"
    };
    samples.Samples.Add(sample2);
    
    return new XmlResult(samples);
}

この場合のレスポンスは下記のようになります。

xml1.png (109.6 kB)

まとめ

ASP.NET WebAPIを利用すれば同じようなことができるのは プログラミングMicrosoft ASP.NET MVC 第3版ASP.NET MVC 5 対応版 (マイクロソフト公式解説書) に記載があるのですが、まだASP.NET WebAPIについては理解していないこともあり、やれる範囲で実装を進めました。参考になればと思います。