我有一个 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
。
我现在应该做什么?
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 中实现的
朱利安的回答对我的情况很有帮助。根据 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) { ... }
首先,正如你所说,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
}
您的问题需要更多解释!怎么打电话?你使用 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
}