Ok()方法新的ObjectResult()之间有什么区别吗?

PMB*_*rud 24 c# asp.net-core-mvc asp.net-core

场景:在.net核心控制器上实现标准REST API/GET方法.

文档指出OkObjectResult是一个状态为200的ObjectResult.这可以通过Ok(myResult)从ControllerBase继承的方法获得.我认为这是一种方便的方法.

但是,本教程没有使用这种方法 - 而是返回new ObjectResult(myResult)默认为状态200的方法.

这两种方法有什么区别吗?

Ral*_*ing 34

从技术上讲,这两种方法没有区别.

如果你想查看当时的代码,OkObjectResult你会发现它OkObjectResult是一个ObjectResult设置200状态代码,这是默认代码ObjectResult.

对我来说唯一的区别是代码的可读性以及您自己或您的团队偏好.这完全取决于命名以及您想要强调的意图.

 return Ok(myResult);                  // gives emphasis on status, my personal favorite

 return new OkObjectResult(myResult);  // for me a little bit verbose and the same
                                       // effect as Ok; but states we return an Object

 return new ObjectResult(myResult);    // gives emphasis of the content that is returned
Run Code Online (Sandbox Code Playgroud)

  • 好吧,实际上这是一个非常误导性的答案。基于此文档:https://learn.microsoft.com/en-us/dotnet/api/system.web.http.apicontroller.ok?view=aspnetcore-2.1 ApiController 有两个重载。Ok 返回 OkResult,Ok<T>(T) 返回 OkObjectResult。不同之处在于,OkResult 的结果是状态码 200,而 OkObjectResult 则表明它还返回一些值。 (2认同)

PMB*_*rud 6

更新:原始问题中的两种方法+接受答案中的第三种方法现在已被直接返回对象所取代:

 return myResult
Run Code Online (Sandbox Code Playgroud)

当前教程页面的相关示例和解释:

[HttpGet("{id}")]
public async Task<ActionResult<TodoItem>> GetTodoItem(long id)
{
    var todoItem = await _context.TodoItems.FindAsync(id);    
    if (todoItem == null)
    {
        return NotFound();
    }    
    return todoItem;
}
Run Code Online (Sandbox Code Playgroud)

GetTodoItems 和 GetTodoItem 方法的返回类型为 ActionResult<T> 类型。ASP.NET Core 自动将对象序列化为 JSON 并将 JSON 写入响应消息的正文中。假设没有未处理的异常,此返回类型的响应代码为 200。未处理的异常会转换为 5xx 错误。