NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?
咨询区
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 中抛出的异常封装成对象?相关推荐
- 如何友好的处理 WebApi 中抛出的错误
微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一种运行时错误,异常处理是一种处理运行时错误的技术,每一个开发者都应该知道如何处 ...
- 在 Asp.Net Core WebAPI 中防御跨站请求伪造攻击
什么是跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或 ...
- ASP.NET Core WebAPI中使用JWT Bearer认证和授权
为什么是 JWT Bearer ASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer, ...
- ASP.NET Core WebAPI中的分析工具MiniProfiler
安装 我们可以使用Nuget来下载这个包. PM> Install-Package MiniProfiler.AspNetCore.Mvc 配置Startup.cs MiniProfiler配置 ...
- ASP.NET CORE WebAPI 中 Route 属性配置
1 访问路径属性 Route public class OrdersController : ApiController {[Route("customers/{customerId}/o ...
- ASP.NET 如何catch存储过程中抛出的异常信息
修改资料库的时候,我们要做一些判定,比如输入的资料不能为空.资料已存在或与其它表的资料关联不能删除等等. 输入的资料不能为空,这些都直接交由逻辑层去处理,而资料已存在呀.关联呀等等,这部分推荐让数据层 ...
- NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ?
咨询区 Naor: 我有下面的一个查询: int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSiz ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...
最新文章
- 线程可见性和关键字volatile
- java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
- 创建war类型的maven工程时报web.xml is missing and failOnMissingWebXml is set to true
- android 应用区高度,Android创建显示区高度可以调整的ScrollView
- Android保存用户名和密码
- C Linux 多线程入门
- 认识CSS中高级技巧之元素的显示与隐藏
- java9模块不可见问题
- 正则维纳滤波matlab,正则化约束维纳滤波
- cad插件加载bplot成功用不了_AUTOCAD 能加载BatchPlot.VLX批量打印插件但是输入bplot打不开批量打印界面...
- 计算机英语二国家线,历年考研英语国家线一览表
- 银行服务器linux系统,银行操作系统
- ubuntu下使用笔记本摄像头
- 七升七降调号_乐理知识:降号调的构成及其调号
- 学习淘宝分享出来的链接web检测打开原生App
- iib 9.0.0.2 安装
- bash grep 判断_bash 退出状态与条件判断
- 大型网站架构 图片服务器分离
- 以点对点的方式连接8台计算机共需要多少条传输线?如果是9台呢?10台呢?使用什么公式来计算这个结果?...
- 安卓盒子刷rec linux启动,常见电视或盒子进入Recovery模式的方法汇总
热门文章
- c++直角坐标系与极坐标系的转换_一篇阅读量高达2百6十多万的关于坐标系和投影的相关知识探讨...
- 初步解决博客园代码高亮的一个方案
- Information Retrieval 倒排索引 学习笔记
- java-回调机制详解
- 步步为营-11-ListT泛型的简单练习
- spring+springMvc+mybatis 调用oracle 存储过程
- [再寄小读者之数学篇](2014-11-14 矩阵的应用: 多项式)
- oracle使用sqlplus查询sql格式
- 自定义异常禁用异常堆栈_如何在Mac上禁用或自定义自动更正
- 从Windows XP升级? 这是您需要了解的Windows 7