我现有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`但是如何管理自定义输出格式更改?
我的意思是我需要对WrappingHandler
和ApiResponse
anyhelp进行哪些更改?
答案 0 :(得分:1)
你正在混合不同的东西。
关于控制器操作应返回的结果(来自doc):
返回任何特定类型不需要操作; MVC支持任何对象返回值。如果操作返回
IActionResult
实现并且控制器继承自Controller,那么开发人员可以使用许多辅助方法来对应许多选项。返回非IActionResult
类型对象的操作的结果将使用相应的IOutputFormatter
实现进行序列化。
IActionResult
只是定义以下合同的接口:
Task ExecuteResultAsync(ActionContext context)
是的,ASP.NET Core提供了许多用于不同目的的预定义类:
StatusCodeResult
或更具体的类,例如OkResult
,NotFoundResult
等JsonResult
,ContentResult
等。因此,您可以自由选择更适合您案例的内容。
关于WrappingHandler
替换-it是控制器操作主要负责创建响应。其他人应该更好地使用数据模型。换句话说,您的WrappingHandler
类应该是某种类型的服务:
public class DataService
{
public MyClass RetriveData(string name)
{
var mydata = _context.Get(name);
return mydata
}
}
RetriveData
方法可能会引发异常,并且您不希望在这种情况下将200 OK作为响应 - 这不是DataService
类处理此逻辑的责任。