モチベーション
翻訳: WebAPI 設計のベストプラクティス - Qiita
JSON はデフォルトで整形しよう
圧縮された状態の JSON をブラウザ上で見るのは、決して気持ちの良いものではありません
はい。整形されたJSONを返したいです。
手段
Web API Poster - ASP.netによると、アクション(Controllerのメソッド)の返した結果を変更するには、ActionFilterを追加します。
事後処理はOnActionExecuted
メソッドに定義します。
PrettyPrintFilterAttribute.cs
using System.Net.Http.Formatting;
using System.Web.Http.Filters;
namespace WebApplication1
{
public class PrettyPrintFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
JsonMediaTypeFormatter jsonFormatter = actionExecutedContext.ActionContext.RequestContext.Configuration.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
base.OnActionExecuted(actionExecutedContext);
}
}
}
AcitionFilterをHttpConfigurationに登録すると、すべてのアクションに適用できます。
WebApiConfig.cs
using System.Web.Http;
namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API の設定およびサービス
config.Filters.Add(new PrettyPrintFilterAttribute());
// Web API ルート
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
WebApiConfig.Register
はGlobal.asax.cs
で呼び出されている前提です。
Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Routing;
namespace WebApplication1
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}