gpt4 book ai didi

c# - 如何从 IActionResult 检索 HTTP 代码和内容?

转载 作者:行者123 更新时间:2023-12-04 00:04:29 26 4
gpt4 key购买 nike

我的 Controller 中有 7 个 Action 。我已经重构了它们,并且能够隔离公共(public)部分。

public IActionResult Get()
{
var response = CommonCode();
}

public IActionResult Get(guid id)
{
var response = CommonCode();
}

public IActionResult Post(ViewModel vm)
{
var response = CommonCode();
}

这是我重构通用代码的地方。
provate IActionResult CommonCode()
{
if(userHasNoPermission())
return Forbid();

if(IdProvidedDoesntExist())
return BadRequest();

//...
}

当我查看 response 内部时,我只看到一种方法: ExecuteResultAsync() .

有没有办法检索我在辅助方法中发送的 HTTP 代码?

例如,如果它是 500,我想停止处理,检索要添加到 ModelState* 的消息如果是 400 , 但如果是 OK 则继续.

最佳答案

CommonCode的返回只是某种类型的IActionResult . “结果”实际上并不是“响应”。稍后,当操作完全返回到请求管道中时(当您直接在代码中调用该方法时尚未发生)。因此,HTTP 状态码之类的概念甚至都不相关。如果您返回类似 StatusCodeResult 的内容,这在技术上只是一个建议的状态码。如果稍后在请求管道中出现异常,或者某些中间件出于某种原因显式更改了状态码,则情况会有所不同。

总而言之,您试图将两个不相关的事物混为一谈。我想你只是想知道 CommonCode 中发生了什么。 ,并认为 HTTP 状态是确定它的最佳方法。实际上,通过返回元组或执行模式匹配之类的操作会更好地为您服务:

使用元组,您实际上可以从 CommonCode 返回不止一件事。方法。例如,您可以执行以下操作:

private (int, IActionResult) CommonCode()
{
if(userHasNoPermission())
return (403, Forbid());

if(IdProvidedDoesntExist())
return (400, BadRequest());

//...
}

然后:
public IActionResult Get()
{
(var status, var response) = CommonCode();
// branch on `status`
}

或者,使用模式匹配:
public IActionResult Get()
{
var response = CommonCode();
switch (response)
{
case ForbidResult forbid:
// do something for forbidden
break;
case BadRequestResult badRequest:
// do something for bad request
break;
}
}

关于c# - 如何从 IActionResult 检索 HTTP 代码和内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50973340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com