You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:54:07