[英]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
}
首先,正如您所说,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 中实现的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.