如何在ASP.NET Core中获取ActionResult StatusCode

问题描述 投票:0回答:4

我有一个 API,其返回类型为

ActionResult
:

[HttpPost("UploadFiles")]
public async Task<ActionResult> MyFunction(MyFunctionInput input) 
{
    if (input.Id == null) 
    {
        retrun BadRequest("Id must exist");
    }

    // Do some stuff

    return Ok();
}

我从同一类中的另一个 API 调用此函数并将结果存储在变量中。但是当我尝试从结果中获取

StatusCode
时,它说
ActionResult
不包含
StatusCode
的定义,如下

var response = await MyFunction(attInput);

if (response.StatusCode == System.Net.HttpStatusCode.NotFound || 
    response.StatusCode == System.Net.HttpStatusCode.BadRequest)
{
    //To Do
}

我用谷歌搜索了它,但几乎每个人都说将结果转换为

OkObjectResult

我现在应该做什么?

c# asp.net-core actionresult
4个回答
2
投票

当查看

ActionResult<T>
的源代码时,我们可以看到:

public sealed class ActionResult<TValue> : IConvertToActionResult

IActionResult IConvertToActionResult.Convert()
{
    if (Result != null)
    {
        return Result;
    }

    int statusCode;
    if (Value is ProblemDetails problemDetails && problemDetails.Status != null)
    {
        statusCode = problemDetails.Status.Value;
    }
    else
    {
        statusCode = DefaultStatusCode;
    }

    return new ObjectResult(Value)
    {
        DeclaredType = typeof(TValue),
        StatusCode = statusCode
    };
}

所以它就在那里,但你需要一些代码来获取它:

private static int? GetStatusCode<T>(ActionResult<T?> actionResult)
{
    IConvertToActionResult convertToActionResult = actionResult; // ActionResult implicit implements IConvertToActionResult
    var actionResultWithStatusCode = convertToActionResult.Convert() as IStatusCodeActionResult;
    return actionResultWithStatusCode?.StatusCode;
}

使用示例:

ActionResult<MyResponse> actionResult = await controller.Get(request);
var statuscode = GetStatusCode(actionResult);

请注意,这似乎是在 .NET 6 中实现的


0
投票

朱利安的回答对我的情况很有帮助。根据 Julian 提供的示例代码,我所做的是将响应显式转换为 IStatusCodeActionResult,以获取对 StatusCode 属性的访问权限。我能够转换响应,因为我的控制器方法的方法签名是 Task 类型,并且 IStatusCodeActionResult 接口取决于 IActionResult。

即:

var response = await controller.GetJob(_id);
// Should be 200 or 404
int? statusCode = ((IStatusCodeActionResult)response).StatusCode; 

方法签名:

public async Task<IActionResult> GetJob(Guid id) { ... }

-1
投票

首先,正如你所说,ActionResult不包含StatusCode的定义。如果你想获得带有

response.StatusCode
的StatusCode,你可以尝试使用HttpClient,如图
Zanyar J.Ahmed
所示。如果你想获得带有
await MyFunction(attInput);
的StatusCode,你可以尝试在
MyFunction
中用Session设置statuscode。

启动.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });

       ...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseSession();

        ...
    }

API:

[HttpPost("UploadFiles")]
public async Task<ActionResult> MyFunction(MyFunctionInput input) 
{
    if (input.Id == null) 
    {
        HttpContext.Session.SetInt32("StatusCode", 400);
        retrun BadRequest("Id must exist");
    }

    // Do some stuff
    if (HttpContext.Session.GetInt32("StatusCode") == null)
            {
                HttpContext.Session.SetInt32("StatusCode", 200);
            }
    return Ok();
}

获取状态码:

var response = await MyFunction(attInput);

if (HttpContext.Session.GetInt32("StatusCode")=400)
{
    //To Do
}

-2
投票

您的问题需要更多解释!怎么打电话?你使用 HttpClient ?或者通过 Ajax 调用?请通过回答我的问题来编辑您的问题。

下面大致解释一下如何获取状态代码

如果你想在后端请求花药API,请使用HttpClient

// TODO: make request
var response = await client.GetAsync(url);

// get status code 
if(response.StatusCode == StatusCode.Ok) // when your endpoint success state
{
    //TODO: write code here 
}

在 ASP.NET Core 中使用 IHttpClientFactory 发出 HTTP 请求

© www.soinside.com 2019 - 2024. All rights reserved.