Asp.net mvc Ok()与Ok(空)

Asp.net mvc Ok()与Ok(空),asp.net-mvc,asp.net-core,asp.net-core-webapi,Asp.net Mvc,Asp.net Core,Asp.net Core Webapi,Ok() Ok(null)返回状态代码204,没有正文,只有标题,因此我们必须以这种方式更改代码: [HttpGet] public IActionResult GetTest(string test) { MyClass result = GetMyClass(test) if(result == null) return Ok(); return Ok(result); } 官方文件说 Ok()创建一个OkResult对象,该对象生成一个空的Status200OK

Ok()

Ok(null)
返回状态代码204,没有正文,只有标题,因此我们必须以这种方式更改代码:

[HttpGet]
public IActionResult GetTest(string test)
{
    MyClass result = GetMyClass(test)
    if(result == null) return Ok();
    return Ok(result);
}

官方文件说

Ok()创建一个OkResult对象,该对象生成一个空的Status200OK 答复

Ok(对象)创建一个OkObjectResult对象,该对象生成 状态200OK响应

当您传递null时,它将创建一个null的OkObjectResult,因此您将获得204个状态代码。

HTTP状态代码是一个有效的“成功”结果,它让收件人知道没有内容。这实际上似乎相当合适,但可能并非所有地方都支持

您可以“教”(或编程)收件人正确处理它,或者您需要应用解决方法

如果您在多个位置需要此解决方法,则可以使用基类重载
Ok()
(或者更准确地说,重新定义它),以始终执行您需要的操作,如下所示:

public abstract class MyBaseApiController : ApiController
{
    public new IHttpActionResult Ok<T>(T content)
    {
        if (content == null) return base.Ok();
        return base.Ok(content);
    }
}
公共抽象类MyBaseApiController:ApicController
{
公共新IHttpActionResult正常(T内容)
{
if(content==null)返回base.Ok();
返回base.Ok(content);
}
}

我建议您使用NoContent(HTTPStatus 204),这意味着请求已成功执行,但未返回值或对象,并且它是用于此目的的官方状态代码,如下所示:

[HttpGet()]
public IActionResult GetTest(string test)
{
    MyClass result = GetMyClass(test)
    if(result != null) return Ok(result);
    return NoContent();
}

希望你会觉得这很有用。

你似乎回答了自己的问题?@Liam问题是“为什么”;)为什么?Ok()与Ok(null)的对比,为什么?这个问题也没有多大意义。@Liam是的@杰米-你读过那个链接吗?它表示“HTTP 204无内容成功状态响应代码”。成功意味着没有发生错误…在本例中,由于方法名为GetSomething,我认为应该有响应,因此这不是正确的响应方式。。。可能404(未找到资源)比OK状态或No内容更合适status@JEMI-是的,我知道你的意思,但是其他读者可能会对“error”一词的用法感到困惑,因为它有一个特定的含义,在本例中,代码没有给出一个error@Milney好的..明白了..我的错误为什么我找不到要从中继承的
ApiController
?VS建议使用
ApiControllerBase
ApiControllerAttribute
。我错过了什么?