2017-01-31 13 views
1

私はASP.NETコアWeb APIに基づいてRESTサービスを開発しており、レスポンスjsonが字下げでフォーマットされ、Webで読めるようにパラメータ 'prettify'をエンドポイントに追加します。ブラウザ。Asp WebApi:Prettify ActionResult JSON出力

私の質問 - ASP.WEB APIコアアプリケーションのコントローラーメソッドごとにJSONフォーマットを変更するにはどうすればよいですか?

あなたを助けてくれてありがとうございます。

+1

この機能を追加するアクションフィルターを作成します。私は委任ハンドラを使ってweb api(コアではない)で同じことを達成しました。そのリクエストを検査し、URL内のprettify = trueクエリーパラメータに基づいてjsonフォーマッタインデントを更新します – Nkosi

+0

あなたのコメントをいただきありがとうございます! – Valentine

答えて

1

このアクションを追加するアクションフィルターを作成します。私はここではURLにprettify=trueクエリパラメータに基づいて要求を検査し、JSONフォーマッタのインデントを更新してしまうDelegatingHandlerを使用してAsp.NetのWeb API 2(ないコア)に

を同じことを達成していたそれはで行われていた方法です委任ハンドラ

/// <summary> 
/// Custom handler to allow pretty print json results. 
/// </summary> 
public class PrettyPrintJsonHandler : DelegatingHandler { 
    const string prettyPrintConstant = "pretty"; 
    MediaTypeHeaderValue contentType = MediaTypeHeaderValue.Parse("application/json;charset=utf-8"); 
    private System.Web.Http.HttpConfiguration httpConfig; 
    /// <summary> 
    /// Initializes a new instance of the <seealso cref="PrettyPrintJsonHandler"/> class with an HTTP Configuration. 
    /// </summary> 
    /// <param name="config"></param> 
    public PrettyPrintJsonHandler(System.Web.Http.HttpConfiguration config) { 
     this.httpConfig = config; 
    } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { 
     var canPrettyPrint = checkQuery(request.RequestUri.Query); 
     var jsonFormatter = httpConfig.Formatters.JsonFormatter; 
     jsonFormatter.Indent = canPrettyPrint; 

     var response = await base.SendAsync(request, cancellationToken); 

     if (canPrettyPrint && response.Content != null) { 
      response.Content.Headers.ContentType = contentType; 
     } 

     return response; 
    } 

    private bool checkQuery(string queryString) { 
     var canPrettyPrint = false; 
     if (!string.IsNullOrWhiteSpace(queryString)) { 
      var prettyPrint = QueryString.Parse(queryString)[prettyPrintConstant]; 
      canPrettyPrint = !string.IsNullOrWhiteSpace(prettyPrint) && Boolean.TryParse(prettyPrint, out canPrettyPrint) && canPrettyPrint; 
     } 
     return canPrettyPrint; 
    } 
} 

セットアップ中にグローバルメッセージハンドラとして追加されました。

アクションフィルタにも同じ概念を適用できます。

0

@Nkosiのコメントに感謝、私は解決策を見つけました。以下は 'prettify'パラメータを検索し、出力JSONに字下げを追加するアクションフィルタのコードです。パラメータを省略すると、インデントも追加されます。

public class OutputFormatActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     var actionResult = context.Result as ObjectResult; 
     if (actionResult == null) return; 

     var paramObj = context.HttpContext.Request.Query["prettify"]; 
     var isPrettify = string.IsNullOrEmpty(paramObj) || bool.Parse(paramObj); 

     if (!isPrettify) return; 

     var settings = new JsonSerializerSettings { Formatting = Formatting.Indented }; 

     actionResult.Formatters.Add(new JsonOutputFormatter(settings, ArrayPool<char>.Shared)); 
    } 
}