咨询区

rianjs

在 ASP.NET Core WebAPI 中,我的 Controller 代码如下:


[Route("create-license/{licenseKey}")]
public async Task<LicenseDetails> CreateLicenseAsync(string licenseKey, CreateLicenseRequest license)
{try{// ... controller-y stuffreturn await _service.DoSomethingAsync(license).ConfigureAwait(false);}catch (Exception e){_logger.Error(e);const string msg = "Unable to PUT license creation request";throw new HttpResponseException(HttpStatusCode.InternalServerError, msg);}
}

上面的这段代码如果抛异常了,将返回 http 500 + 自定义错误,我现在有两个疑问:

  • 直接返回错误信息,不想用重量级的 throw new xxx 。

  • 如何将错误处理全局统一化 ?

回答区

peco

如果不想用 throw new 的话,可以把 CreateLicenseAsync() 方法稍微改造一下。

  • 返回值改成 IActionResult

  • throw new 改成 StatusCode

参考代码如下:


[Route("create-license/{licenseKey}")]
public async Task<IActionResult> CreateLicenseAsync(string licenseKey, CreateLicenseRequest license)
{try{// ... controller-y stuffreturn Ok(await _service.DoSomethingAsync(license).ConfigureAwait(false));}catch (Exception e){_logger.Error(e);const string msg = "Unable to PUT license creation request";return StatusCode((int)HttpStatusCode.InternalServerError, msg)}
}

如果你想把 错误处理 应用到全局,可以在 中间件 中实现异常的统一处理。

先定义一个 ExceptionMiddleware 中间件。


public class ExceptionMiddleware
{private readonly RequestDelegate _next;public ExceptionMiddleware(RequestDelegate next){_next = next;}public async Task Invoke(HttpContext context){try{await _next(context);}catch (Exception ex){context.Response.ContentType = "text/plain";context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;await context.Response.WriteAsync(ex.Message);    }}
}

接下来将其注入到 request pipeline 中即可。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory){app.UseMiddleware<ExceptionMiddleware>();app.UseMvc();}

点评区

asp.net core 的统一异常信息处理,这种功能真的太实用了,刚好最近做的新项目也搭配进去了,不过我到没有使用 Middleware ,而是模仿 asp.net 时代的 异常过滤器 实现,参考代码如下:

/// <summary>/// 全局异常处理/// </summary>public class IbsExceptionFilter : ExceptionFilterAttribute{public override Task OnExceptionAsync(ExceptionContext context){context.ExceptionHandled = true;HttpResponse response = context.HttpContext.Response;response.StatusCode = 200;response.ContentType = "application/json";var message = context.Exception.Message;context.Result = new JsonResult(ApiResponse.Err(message));return Task.CompletedTask;}}

然后我在 ConfigureServices() 中做了一个全局注册,参考代码如下:

public void ConfigureServices(IServiceCollection services){services.AddControllers(config => { config.Filters.Add(new IbsExceptionFilter()); });}

这种方式也是可以搞定的,实现方式多种多样,以此纪念一下????????????

原文链接:https://stackoverflow.com/questions/43358224/how-can-i-throw-an-exception-in-an-asp-net-core-webapi-controller-that-returns-a

NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?相关推荐

  1. 如何友好的处理 WebApi 中抛出的错误

    微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一种运行时错误,异常处理是一种处理运行时错误的技术,每一个开发者都应该知道如何处 ...

  2. 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击

    什么是跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或 ...

  3. ASP.NET Core WebAPI中使用JWT Bearer认证和授权

    为什么是 JWT Bearer ASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer,  ...

  4. ASP.NET Core WebAPI中的分析工具MiniProfiler

    安装 我们可以使用Nuget来下载这个包. PM> Install-Package MiniProfiler.AspNetCore.Mvc 配置Startup.cs MiniProfiler配置 ...

  5. ASP.NET CORE WebAPI 中 Route 属性配置

    1 访问路径属性  Route public class OrdersController : ApiController {[Route("customers/{customerId}/o ...

  6. ASP.NET 如何catch存储过程中抛出的异常信息

    修改资料库的时候,我们要做一些判定,比如输入的资料不能为空.资料已存在或与其它表的资料关联不能删除等等. 输入的资料不能为空,这些都直接交由逻辑层去处理,而资料已存在呀.关联呀等等,这部分推荐让数据层 ...

  7. NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ?

    咨询区 Naor: 我有下面的一个查询: int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSiz ...

  8. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

  9. 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...

最新文章

  1. 线程可见性和关键字volatile
  2. java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
  3. 创建war类型的maven工程时报web.xml is missing and failOnMissingWebXml is set to true
  4. android 应用区高度,Android创建显示区高度可以调整的ScrollView
  5. Android保存用户名和密码
  6. C Linux 多线程入门
  7. 认识CSS中高级技巧之元素的显示与隐藏
  8. java9模块不可见问题
  9. 正则维纳滤波matlab,正则化约束维纳滤波
  10. cad插件加载bplot成功用不了_AUTOCAD 能加载BatchPlot.VLX批量打印插件但是输入bplot打不开批量打印界面...
  11. 计算机英语二国家线,历年考研英语国家线一览表
  12. 银行服务器linux系统,银行操作系统
  13. ubuntu下使用笔记本摄像头
  14. 七升七降调号_乐理知识:降号调的构成及其调号
  15. 学习淘宝分享出来的链接web检测打开原生App
  16. iib 9.0.0.2 安装
  17. bash grep 判断_bash 退出状态与条件判断
  18. 大型网站架构 图片服务器分离
  19. 以点对点的方式连接8台计算机共需要多少条传输线?如果是9台呢?10台呢?使用什么公式来计算这个结果?...
  20. 安卓盒子刷rec linux启动,常见电视或盒子进入Recovery模式的方法汇总

热门文章

  1. c++直角坐标系与极坐标系的转换_一篇阅读量高达2百6十多万的关于坐标系和投影的相关知识探讨...
  2. 初步解决博客园代码高亮的一个方案
  3. Information Retrieval 倒排索引 学习笔记
  4. java-回调机制详解
  5. 步步为营-11-ListT泛型的简单练习
  6. spring+springMvc+mybatis 调用oracle 存储过程
  7. [再寄小读者之数学篇](2014-11-14 矩阵的应用: 多项式)
  8. oracle使用sqlplus查询sql格式
  9. 自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正
  10. 从Windows XP升级? 这是您需要了解的Windows 7