繁体   English   中英

ASP.NET Core中如何获取ActionResult StatusCode

[英]How to get ActionResult StatusCode in ASP.NET Core

我有一个 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();
}

我在同一个 class 中从另一个 API 调用这个 function 并将结果存储在一个变量中。 但是当我试图从结果中获取StatusCode时,它说ActionResult不包含像这样的StatusCode的定义

var response = await MyFunction(attInput);

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

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

我现在应该怎么办?

你的问题需要更多解释??? 怎么打电话。 你使用 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 核心中的 IHttpClientFactory 发出 HTTP 请求

首先,正如您所说,ActionResult 不包含 StatusCode 的定义。如果您想通过response.StatusCode获取 StatusCode ,您可以尝试使用 HttpClient 作为Zanyar J.Ahmed所示。如果您想通过await MyFunction(attInput); ,您可以尝试在MyFunction中使用 Session 设置状态码。

启动.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
}

在查看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 中实现的

从 ActionResult 中获取值<object>在 ASP.Net Core API 方法中<div id="text_translate"><p>我尝试从 ASP.NET 核心 API 方法中的ActionResult&lt;object&gt;获取值。</p><p> API 有不同的 controller。 我尝试使用 controller A 中的 controller B 中的方法返回结果值。 我从 controller B 得到一个ActionResult object。我可以在ResultObject中使用调试器查看该值,但是如何访问其中的结果值?</p><pre> public ActionResult&lt;object&gt; getSourceRowCounter(string sourcePath) //Method from Controller A { var result = ControllerB.GetValue($"{sourcePath}.{rowCounterVariableName}"); var result2 = result.Value; //null var result3 = result.Result; //typ: {Microsoft.AspNetCore.Mvc.OkObjectResult} &lt;-see Value=4 in it with Debugger //var result4 = result3.Value; //Error?. //var result5 = result3;Content? //Error.? //var result6 = result3????;?; //How can i get the Value = 4? return Ok(result); //should only return value 4 and not the whole object }</pre> <p><img src="https://i.stack.imgur.com/4Lppi.jpg" alt="在此处输入图像描述"></p></div></object>

[英]Get a Value from ActionResult<object> in a ASP.Net Core API Method

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在asp.net core中编写自定义actionResult 如何在 ASP.NET 核心中使用 mysql 进行单元测试和操作结果 ASP.NET Core 中的状态码 406(不可接受) 如何重构ASP.Net MVC ActionResult? Asp.Net-如何使用ajax调用ActionResult 从 ActionResult 中获取值<object>在 ASP.Net Core API 方法中<div id="text_translate"><p>我尝试从 ASP.NET 核心 API 方法中的ActionResult&lt;object&gt;获取值。</p><p> API 有不同的 controller。 我尝试使用 controller A 中的 controller B 中的方法返回结果值。 我从 controller B 得到一个ActionResult object。我可以在ResultObject中使用调试器查看该值,但是如何访问其中的结果值?</p><pre> public ActionResult&lt;object&gt; getSourceRowCounter(string sourcePath) //Method from Controller A { var result = ControllerB.GetValue($"{sourcePath}.{rowCounterVariableName}"); var result2 = result.Value; //null var result3 = result.Result; //typ: {Microsoft.AspNetCore.Mvc.OkObjectResult} &lt;-see Value=4 in it with Debugger //var result4 = result3.Value; //Error?. //var result5 = result3;Content? //Error.? //var result6 = result3????;?; //How can i get the Value = 4? return Ok(result); //should only return value 4 and not the whole object }</pre> <p><img src="https://i.stack.imgur.com/4Lppi.jpg" alt="在此处输入图像描述"></p></div></object> 自定义 Asp.NET Core Identity Unauthorized Response Type 和 Statuscode 如何在 ActionResult ASP.NET Core 2.1 中使用空合并运算符 ASP.NET Core如何将任何类型转换为ActionResult <T> 控制器动作的返回类型? ASP.NET Core API如何在操作方法中将ActionResult <T>转换为T.
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM