如何在EmbedIO中针对HttpException返回自定义内容?
解决EmbedIO中HttpException的data参数不返回的问题
默认情况下,EmbedIO的内置异常处理机制会生成标准的错误页面,并不会自动将HttpException的data参数包含到响应内容里。要返回自定义的JSON响应,你需要覆盖默认的异常处理逻辑,手动处理HttpException并序列化data参数。
实现步骤
1. 注册自定义异常处理器
在初始化WebServer的时候,添加一个OnUnhandledException回调,专门处理HttpException:
using EmbedIO; using EmbedIO.WebApi; using System.Text.Json; // 如果项目用Newtonsoft.Json,替换为using Newtonsoft.Json; var server = new WebServer(options => options .WithUrlPrefix("http://localhost:9696") .WithMode(HttpListenerMode.EmbedIO)) // 按需启用CORS .WithCors() // 注册自定义异常处理逻辑 .OnUnhandledException(async (context, exception) => { // 仅处理HttpException类型的异常 if (exception is HttpException httpEx) { // 设置响应状态码为异常指定的状态码 context.Response.StatusCode = (int)httpEx.StatusCode; // 声明响应内容为JSON格式 context.Response.ContentType = "application/json"; // 构建自定义响应结构,包含提示信息和传入的data var errorResponse = new { message = httpEx.Message, data = httpEx.Data }; // 序列化为JSON字符串(这里用System.Text.Json,也可替换为Newtonsoft.Json) var json = JsonSerializer.Serialize(errorResponse); // Newtonsoft版本:var json = JsonConvert.SerializeObject(errorResponse, Formatting.Indented); // 将JSON写入响应流 await context.Response.WriteAsync(json); // 返回true,告知EmbedIO该异常已处理,无需触发默认错误页面 return true; } // 非HttpException类异常,交给默认处理逻辑 return false; }) // 注册你的API控制器 .WithWebApi("/api", module => module .WithController<YourApiController>()); server.RunAsync();
2. 抛出异常的方式不变
你仍然可以用原来的方式抛出HttpException,传入自定义的data参数:
throw HttpException.Unauthorized( message: "user name does not exist", data: new { userName = "testUser", userNameExist = false, attempt = 5 });
关键说明
- 响应格式控制:通过设置
ContentType为application/json,确保客户端能正确识别响应类型。 - 异常处理标记:返回
true是核心,这会阻止EmbedIO继续使用默认的错误页面生成逻辑。 - 自定义响应结构:你可以根据业务需求调整
errorResponse的结构,比如添加错误码、请求时间戳等字段。
这样配置后,当你抛出带data参数的HttpException时,接口就会返回你期望的JSON响应了。
内容的提问来源于stack exchange,提问作者Ro0f3r
相关产品推荐
相关产品推荐

