2017-09-04 52 views
0

我有ASP.Net WEB API以下的輸出響應格式, 我將該項目轉換爲ASP.NET CORE如何將響應數據格式化爲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" 
     } 
    ] 
} 

了現在,我的項目轉換爲ASP.NET CORE所以我需要改變返回類型,以及從HttpResponseMessageIActionResult or JsonResult`但我怎麼管理我的自定義輸出格式更改?

我的意思是我需要做什麼改變WrappingHandlerApiResponse anyhelp?

+1

爲什麼你需要'WrappingHandler'?爲什麼不直接從操作中返回響應? – peco

+0

'WrappingHandler'我正在做一些格式化,就像我希望將結果寫入'data'中,並且還在'output'中添加了更多的額外字段,例如'metadata'。那就是爲什麼使用WrappingHandler並進行格式化。它適用於asp.net webapi,但如何使用/使這些chnages進入asp.net核心返回響應 – Neo

回答

1

你在混合不同的東西。

關於結果是控制器動作應(從doc)返回:

不需要一個動作以返回任何特定類型; MVC支持任何對象返回值。如果一個動作返回一個實現並且控制器從Controller繼承,那麼開發人員有許多與許多選擇相對應的幫助器方法。來自返回非IActionResult類型對象的操作的結果將使用適當的IOutputFormatter實現序列化。

IActionResult就是一個定義如下契約的接口:

Task ExecuteResultAsync(ActionContext context) 

是的,ASP.NET核心提供了大量的預定義類的不同目的:

  • 簡單StatusCodeResult以上如OkResultNotFoundResult等的具體類
  • 對於特定格式:JsonResult,ContentResult等。

所以你可以自由選擇什麼更適合你的情況。


關於WrappingHandler替換 - 這是控制器操作主要負責創建響應。其他人應該只使用數據模型。換句話說,你的WrappingHandler類應該是某種服務,只有這樣的:

public class DataService 
{ 
    public MyClass RetriveData(string name) 
    { 
     var mydata = _context.Get(name); 
     return mydata 
    } 
} 
  • 如果要格式化的最終響應,如添加自定義標題,可以考慮使用MVC過濾器,尤其是 - ResultFilter
  • 如果您需要一些通用響應驗證 - 請使用ActionFilter,d ExceptionFilterExceptionHandler middleware。換句話說,如果RetriveData以上的方法可能會引發異常,並且您不希望在此情況下有200 OK作爲響應 - 這不是處理此邏輯的類責任。
+0

好的一個得到了你,但響應格式如輸出響應''數據「添加鍵如何:['或添加更多的字段像輸出json中的'data'? – Neo

+1

@Neo將此視爲數據模型(MyClass)或響應模型(ApiResponse)修改的一部分。我的主要觀點是像'new ApiResponse(HttpStatusCode.OK,)'這樣的邏輯應該在控制器動作中。然後使用過濾器,您可以根據需要修改/替換「ApiResponse」實例。 – Set