如何在C#中使用自定义消息显示状态代码?

Kar*_*ran 10 c# asp.net-core

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

return new HttpStatusCodeResult(403, "Not allowed");
Run Code Online (Sandbox Code Playgroud)

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

StatusCode(403) 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 15

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

return Ok("Message");
Run Code Online (Sandbox Code Playgroud)

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

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

return new ObjectResult("Your message") {StatusCode = 403};
Run Code Online (Sandbox Code Playgroud)


ans*_*erk 6

您可以执行以下操作:

return StatusCode(403, Json("Not allowed."));
Run Code Online (Sandbox Code Playgroud)


Mik*_*und 5

我发现ContentResult给出最简单和可用的结果:

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

只需返回该调用即可使用它:

return Result(HttpStatusCode.Unauthorized, "Invalid token");
Run Code Online (Sandbox Code Playgroud)

这将导致文本为401 Status Code: 401; Unauthorized; Invalid token


小智 5

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

return new ObjectResult(Message) { StatusCode = (int)StatusCode };
Run Code Online (Sandbox Code Playgroud)