2017-09-04 21 views
0

私は既存のASP.Net WEB APIの出力レスポンスフォーマットを持っています。 私はそのプロジェクトをASP.NET COREに変換しています。ASP.NET COREにレスポンスデータをフォーマットするにはどうすればよいですか?

私はすでに今、私はので、私はJsonResult` IActionResult orHttpResponseMessageからだけでなく戻り値の型を変更する必要がありますが、どのように私は私のカスタムを管理しない ASP.NET COREにプロジェクトを変換しています。この link

public class MyClass 
{  
    [JsonProperty("id")] 
    public long Id { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; }  
} 

// Helper.cs 
public class ApiResponse 
{ 
    [DataMember(EmitDefaultValue = false)] 
    [JsonProperty(PropertyName = "data")] 
    public object Data { get; set; } 

    public ApiResponse(HttpStatusCode statusCode, object result = null) 
    { 
     Data = result; 
    } 
} 

// Helper.cs 
public class WrappingHandler<T> where T : class 
{ 
    public static HttpResponseMessage ResponseHandler(IEnumerable<T> responseObject, HttpRequestMessage request) 
    { 
     HttpResponseMessage response = request.CreateResponse(HttpStatusCode.OK, responseObject); 
     var newResponse = request.CreateResponse(HttpStatusCode.OK, new ApiResponse(HttpStatusCode.OK, responseObject)); 
     return newResponse; 
    } 
} 

// HomeController.cs 

public HttpResponseMessage RetriveData(string name) 
{ 
    try 
    { 
     var mydata = _context.Get(name); 
     return WrappingHandler<MyClass>.ResponseHandler(mydata, Request); 
    } 
} 

// output for asp.net webapi 
{ 
    "data": [ 
     { 
      "id": 32, 
      "name": "Hi everyone" 
     } 
    ] 
} 

を経てい

出力フォーマットが変わる?

私はWrappingHandlerApiResponse anyhelpに変更する必要がありますか?

+1

なぜ「WrappingHandler」が必要ですか?アクションから直接レスポンスを返さないのはなぜですか? – peco

+0

'WrappingHandler'私は結果を' data'にしたいだけでなく、出力に 'metadata'のような余分なフィールドをいくつか追加するような形式をしています。 WrappingHandlerを使用して書式設定を行う理由ですそれはasp.net webapiに完璧に動作しますが、asp.netコアリターンレスポンス – Neo

答えて

1

さまざまなものを混在させています。コントローラのアクションは、(docから)を返すべきであること結果について

アクションは、任意の特定のタイプを返すように要求されません。 MVCは任意のオブジェクト戻り値をサポートします。アクションがIActionResultの実装を返し、コントローラーがコントローラーを継承する場合、開発者は多くの選択肢に対応する多くのヘルパーメソッドを持っています。 IActionResultタイプでないオブジェクトを返すアクションの結果は、適切なIOutputFormatter実装を使用してシリアル化されます。

IActionResult次の規約を定義するだけのインタフェースです:

Task ExecuteResultAsync(ActionContext context) 

そして、はい、ASP.NETコアは、異なる目的のために事前に定義されたクラスの多くを提供します。

  • シンプルStatusCodeResult以上OkResult,NotFoundResultなどの特定のクラス
  • 特定のフォーマット:JsonResult,ContentResultなど

あなたのケースに適したものを自由に選択することができます。


WrappingHandler置換については、コントローラのアクションの主な責任は、応答を作成することです。他の方は、データモデルのみで作業する方がよいでしょう。言い換えれば、あなたのWrappingHandlerクラスは、このようなだけの何かとのサービスのいくつかの種類でなければなりません:

public class DataService 
{ 
    public MyClass RetriveData(string name) 
    { 
     var mydata = _context.Get(name); 
     return mydata 
    } 
} 
  • あなたが最終的な応答をフォーマットしたい場合は、カスタムヘッダーを追加するように、具体的には、MVCのフィルタを使用することを検討してください - ResultFilter
  • 一般的な応答検証が必要な場合は、ActionFilter、d ExceptionFilterまたはExceptionHandler middlewareを使用します。つまり、上記のRetriveDataメソッドが例外を発生させる可能性があり、この場合レスポンスとして200 OKを返すことを望まない場合 - このロジックを処理するのはDataServiceクラスの責任ではありません。
+0

にこれらのchnagesを使用/作成する方法が良いですが、出力レスポンスのためのキーを追加するようなレスポンスフォーマットはどうですか?出力jsonの 'data'のようなものですか? – Neo

+1

@Neoデータモデル(MyClass)または応答モデル(ApiResponse)の変更の一部としてこれを検討してください。私の主なポイントは、 '新しいApiResponse(HttpStatusCode.OK、)'のようなロジックはコントローラアクションにあるべきです。フィルタを使用すると、必要に応じて 'ApiResponse'インスタンスを変更/置換することができます。 – Set

関連する問題