如何将响应数据格式化为ASP.NET CORE?

时间:2017-09-04 10:49:52

标签: c# asp.net asp.net-web-api asp.net-core

我现有ASP.Net WEB API以下输出响应格式, 我正在将该项目转换为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所以我需要将返回类型从HttpResponseMessage更改为IActionResult or JsonResult`但是如何管理自定义输出格式更改?

我的意思是我需要对WrappingHandlerApiResponse anyhelp进行哪些更改?

1 个答案:

答案 0 :(得分:1)

你正在混合不同的东西。

关于控制器操作应返回的结果(来自doc):

  

返回任何特定类型不需要操作; MVC支持任何对象返回值。如果操作返回IActionResult实现并且控制器继承自Controller,那么开发人员可以使用许多辅助方法来对应许多选项。返回非IActionResult类型对象的操作的结果将使用相应的IOutputFormatter实现进行序列化。

IActionResult只是定义以下合同的接口:

Task ExecuteResultAsync(ActionContext context)

是的,ASP.NET Core提供了许多用于不同目的的预定义类:

  • 简单StatusCodeResult或更具体的类,例如OkResultNotFoundResult
  • 表示特定格式:JsonResultContentResult等。

因此,您可以自由选择更适合您案例的内容。

关于WrappingHandler替换-it是控制器操作主要负责创建响应。其他人应该更好地使用数据模型。换句话说,您的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作为响应 - 这不是DataService类处理此逻辑的责任。