如何检查IActionResult返回的204状态码及解决Json异常?
解决方案
1. 正确获取IActionResult的状态码
IActionResult是抽象基类,本身没有StatusCode属性,你需要判断它的具体实现类型(你的方法返回的是StatusCodeResult),再获取状态码。
两种可行写法:
写法一:类型转换+空检查
IActionResult response = await _benchmarkingClient.CheckAndLoadJobDetails(checkAndLoadJobDetailsRequest); if (response is StatusCodeResult statusCodeResult) { context.Logger.LogLine($"Response StatusCode: {statusCodeResult.StatusCode}"); if (statusCodeResult.StatusCode == StatusCodes.Status204NoContent) { // 这里写204状态的处理逻辑 } }
写法二:直接模式匹配(C# 8.0+支持)
IActionResult response = await _benchmarkingClient.CheckAndLoadJobDetails(checkAndLoadJobDetailsRequest); if (response is StatusCodeResult { StatusCode: StatusCodes.Status204NoContent }) { // 直接处理204逻辑 } // 还可以扩展其他状态码的判断 else if (response is StatusCodeResult { StatusCode: StatusCodes.Status500InternalServerError }) { // 处理500错误 }
2. 解决JsonException问题
你遇到的JsonException是因为代码后续尝试反序列化204响应的空体导致的。解决方案很简单:先判断状态码,只有当状态码是包含响应体的类型(比如200)时,才去反序列化;如果是204这类无内容状态,直接跳过反序列化步骤。
示例:
IActionResult response = await _benchmarkingClient.CheckAndLoadJobDetails(checkAndLoadJobDetailsRequest); if (response is StatusCodeResult statusCodeResult) { if (statusCodeResult.StatusCode == StatusCodes.Status204NoContent) { // 204无内容,直接返回或处理,不执行反序列化 return; } else if (statusCodeResult.StatusCode == StatusCodes.Status200OK) { // 这里执行反序列化逻辑 } }
补充说明
从你提供的CheckAndLoadJobDetails方法代码来看,它的返回值只有两种情况:要么是StatusCodeResult(204或500),要么抛出BadHttpRequestException(409或500)。所以上面的类型判断完全覆盖了所有场景,不需要考虑其他IActionResult的实现类。
内容的提问来源于stack exchange,提问作者Cjmaret
相关产品推荐
相关产品推荐

