【问题标题】:How to show the status code with custom message in c#?如何在 C# 中显示带有自定义消息的状态代码?
【发布时间】:2017-10-11 13:05:54
【问题描述】:

在 MVC5 中,我使用以下代码返回带有自定义消息的状态代码。它在我的输出中显示提供的消息。

return new HttpStatusCodeResult(403, "Not allowed");

在.net核心框架中,上面的方法不适用,所以我尝试了下面的方法,但我没有找到如何传递自定义消息。

StatusCode(403) 

它将默认消息显示为“禁止”

如何在 StatusCode 中提供自定义消息?还有其他方法吗?

【问题讨论】:

  • 试试return Forbid("Not allowed");
  • 它不工作

标签: c# asp.net-core


【解决方案1】:

你可以这样做:

return StatusCode(403, Json("Not allowed."));

【讨论】:

  • StatusCode 的示例?这是一个自定义类吧?
  • StatusCode 不是自定义的。这是一个内置在基本控制器上的方法,用于返回一个新的 ObjectResult。
【解决方案2】:

我研究了标准方法的实现(感谢 Resharper 的反编译器):

return Ok("Message");

它基本上创建新的 OkObjectResult,将值(“消息”)提供给它的构造函数,并返回该对象。反过来,OkObjectResult 只是 ObjectResult 的派生词,它有自己的字段和默认状态代码 (200),将放入其构造函数参数(消息或您提供的任何对象)中的内容重新转换为基本构造函数 (ObjectResult),并分配从它的私有常量字段到基类的属性 StatusCode 的值,所以它基本上是 ObjectResult 的一种包装器。

那么,从所有这些中可以得出什么结论:我们可以使用 ObjectResult 基类以类似的方式返回带有消息的状态代码:

return new ObjectResult("Your message") {StatusCode = 403};

【讨论】:

    【解决方案3】:

    我找到ContentResult 给出了最简单和可用的结果:

    private static ActionResult Result(HttpStatusCode statusCode, string reason) => new ContentResult
    {
        StatusCode = (int)statusCode,
        Content = $"Status Code: {(int)statusCode}; {statusCode}; {reason}",
        ContentType = "text/plain",
    };
    

    通过简单地返回调用来使用它:

    return Result(HttpStatusCode.Unauthorized, "Invalid token");
    

    这将导致带有文本Status Code: 401; Unauthorized; Invalid token 的 401。

    【讨论】:

      【解决方案4】:

      如果你不在控制器中,你可以这样做

      return new ObjectResult(Message) { StatusCode = (int)StatusCode };
      

      【讨论】:

        【解决方案5】:

        我认为@mmushtaq 是对的 - 我想知道您的方法的返回类型是否不是 IActionResult?请参阅下面的代码示例 (pulled from here)。它将返回一个包含消息的 ObjectResult(不是 StatusCodeResult)

        // GET: api/authors/search?namelike=th
        [HttpGet("Search")]
        public IActionResult Search(string namelike)
        {
            var result = _authorRepository.GetByNameSubstring(namelike);
            if (!result.Any())
            {
                return NotFound(namelike);
            }
            return Ok(result);
        }
        


        更多链接和文档:

        View a Microsoft API Tutorial here

        ObjectResult(具有多个属性,包括 StatusCode 和 Value。)

        StatusCodeResult(只有一个 Int32 属性 - StatusCode)

        【讨论】:

          【解决方案6】:

          在 .NET 5 Core MVC 中这行得通:

          return StatusCode(400, "bad request because blahblah");
          

          自定义消息会立即显示在我的 REST 测试软件(邮递员、失眠等)中

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-08
            • 2017-05-09
            • 1970-01-01
            • 2015-05-16
            • 1970-01-01
            相关资源
            最近更新 更多