我正在使用.Net核心和棱角进行我的私人项目,我对如何返回错误感到有点麻烦。
我的后端有层(控制器、服务、存储库和实体)。我已经创建了我想返回的通用响应对象。在我的服务方法中,我将"NotFound“或”内部服务器错误“等不同的错误设置为StatusCode。
我不想在StatusCode上切换大小写,并根据控制器中的情况返回不同的错误,因为我认为这不是一个好的解决方案。返回ApiResponse对象将导致我总是有200个代码,并知道是否有任何错误,我需要检查返回对象的状态代码的角度。我不知道这是不是个好办法。
我想保留这些图层。我希望控制器只处理请求,服务拥有所有的逻辑和存储库来执行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;
    }
  }发布于 2020-06-20 15:22:15
我会在我的核心服务或存储库中抛出异常,让中间件来处理它。ApiError是我的自定义类,有些事情可能与用.NET Core2.2编写的不同,我想您使用的是3.x。还有(如果可以的话)那些api端点urls不是非常RESTful的。
   public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseExceptionHandler(appBuilder =>
        {
            appBuilder.Run(async context => {
                var ex = context.Features.Get<IExceptionHandlerPathFeature>();
                if (ex?.Error is NullReferenceException)
                    context.Response.StatusCode = 404;
                else if (ex?.Error is InvalidOperationException)
                    context.Response.StatusCode = 400;
                else
                    context.Response.StatusCode = 500;
                context.Response.ContentType = "application/json";
                ApiError error = new ApiError()
                {
                    Code = context.Response.StatusCode,
                    Message = env.IsDevelopment() ? ex?.Error.Message : "An unexpected error happened. Try again later."
                };
                await context.Response.WriteAsync(JsonConvert.SerializeObject(error)).ConfigureAwait(false);
            });
        });
   }https://stackoverflow.com/questions/62486770
复制相似问题