首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何返回asp .net核心API中的错误

如何返回asp .net核心API中的错误
EN

Stack Overflow用户
提问于 2020-06-20 13:58:03
回答 1查看 1.7K关注 0票数 2

我正在使用.Net核心和棱角进行我的私人项目,我对如何返回错误感到有点麻烦。

我的后端有层(控制器、服务、存储库和实体)。我已经创建了我想返回的通用响应对象。在我的服务方法中,我将"NotFound“或”内部服务器错误“等不同的错误设置为StatusCode。

我不想在StatusCode上切换大小写,并根据控制器中的情况返回不同的错误,因为我认为这不是一个好的解决方案。返回ApiResponse对象将导致我总是有200个代码,并知道是否有任何错误,我需要检查返回对象的状态代码的角度。我不知道这是不是个好办法。

我想保留这些图层。我希望控制器只处理请求,服务拥有所有的逻辑和存储库来执行CRUD操作。

那么,如何将错误从服务层返回给控制器呢?

这是我的控制器方法的一个版本。

代码语言:javascript
运行
复制
    [Authorize]
    [ApiValidationFilter]
    [HttpPost("updateFacebookUrl/")]
    public async Task<ApiResponse> UpdateFacebookURL([FromBody] UpdateURLVm updateURLVm)
    {
      return await _userInfoService.UpdateFacebookURL(updateURLVm);
    }

这是我的控制器方法的第二个版本。

代码语言:javascript
运行
复制
    [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);
    }

这是我的服务方法。

代码语言:javascript
运行
复制
    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");
      }
    }

返回对象。

代码语言:javascript
运行
复制
 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;
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-20 15:22:15

我会在我的核心服务或存储库中抛出异常,让中间件来处理它。ApiError是我的自定义类,有些事情可能与用.NET Core2.2编写的不同,我想您使用的是3.x。还有(如果可以的话)那些api端点urls不是非常RESTful的。

代码语言:javascript
运行
复制
   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);
            });
        });
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62486770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档