【发布时间】:2021-07-13 17:24:34
【问题描述】:
我正在使用 .Net Core 和 Angular 处理我的私人项目,但我对如何返回错误有点困惑。
我的后端有层(控制器、服务、存储库和实体)。 我已经创建了我想要返回的一般响应对象。在我的服务方法中,我将不同的错误设置为 StatusCode,例如“NotFound”或“Internal server error”。
我不想在 StatusCode 上切换大小写并根据控制器中的错误返回不同的错误,因为我认为这不是一个好的解决方案。 返回 ApiResponse 对象将导致我总是有 200 个代码,并且要知道是否有任何错误,我需要检查 Angular 中返回对象的状态代码。我不知道这是否是一个好的解决方案。
我想保留这些图层。我希望控制器只处理请求,服务拥有所有逻辑和存储库来执行 CRUD 操作。
那么我应该如何将错误从我的服务层返回到控制器?
这是我的控制器方法的一个版本。
[Authorize]
[ApiValidationFilter]
[HttpPost("updateFacebookUrl/")]
public async Task<ApiResponse> UpdateFacebookURL([FromBody] UpdateURLVm updateURLVm)
{
return await _userInfoService.UpdateFacebookURL(updateURLVm);
}
这是我的控制器方法的第二个版本。
[Authorize]
[ApiValidationFilter]
[HttpPost("updateInstagramUrl/")]
public async Task<IActionResult> UpdateInstagramURL([FromBody] UpdateURLVm updateURLVm)
{
var result = await _userInfoService.UpdateInstagramURL(updateURLVm);
if (result.StatusCode != (int)HttpStatusCode.OK)
{
return BadRequest(result);
}
return Ok(result);
}
这是我的服务方式。
public ApiResponse UpdateInstagramURL(UpdateURLVm updateURLVm)
{
try
{
var user = _unitOfWork.userRepository.FindByCondition(x => x.Id == updateURLVm.UserId).FirstOrDefault();
if (user == null)
return new ApiResponse((int)HttpStatusCode.NotFound, "User not found");
user.Instagram = updateURLVm.URL;
_unitOfWork.userRepository.Update(user);
_unitOfWork.Complete();
return new ApiResponse((int)HttpStatusCode.OK);
}
catch (Exception ex)
{
return new ApiResponse((int)HttpStatusCode.InternalServerError, "Something went wrong");
}
}
返回对象。
public class ApiResponse
{
public int StatusCode { get; private set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Message { get; private set; }
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public object Result { get; private set; }
public ApiResponse(int statusCode, string message)
: this(statusCode)
{
this.Message = message;
}
public ApiResponse(object result) :
this(200)
{
Result = result;
}
public ApiResponse(int statusCode)
{
this.StatusCode = statusCode;
}
}
【问题讨论】:
-
我想说你可以尝试引入一些中间件/OnActionExecuted 动作过滤器来分析 IActionResult 并设置有效状态。
-
谢谢,我会研究那个解决方案。
-
是的,我过去使用过中间件,我会发布我的示例
标签: angular asp.net-core