# 请求包装
**本文档中引用的文件**
- [AbpWrapperOptions.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/AbpWrapperOptions.cs)
- [AbpWrapperModule.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/AbpWrapperModule.cs)
- [AbpAspNetCoreWrapperModule.cs](file://aspnet-core/framework/common/LINGYUN.Abp.AspNetCore.Wrapper/LINGYUN/Abp/AspNetCore/Wrapper/AbpAspNetCoreWrapperModule.cs)
- [AbpExceptionHandlingWrapperMiddleware.cs](file://aspnet-core/framework/common/LINGYUN.Abp.AspNetCore.Wrapper/LINGYUN/Abp/AspNetCore/Wrapper/AbpExceptionHandlingWrapperMiddleware.cs)
- [AbpWrapResultFilter.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/Filters/AbpWrapResultFilter.cs)
- [WrapResultChecker.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/WrapResultChecker.cs)
- [IWrapResultChecker.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/IWrapResultChecker.cs)
- [ActionResultWrapperFactory.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/Wraping/ActionResultWrapperFactory.cs)
- [ObjectActionResultWrapper.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/Wraping/ObjectActionResultWrapper.cs)
- [JsonActionResultWrapper.cs](file://aspnet-core/framework/mvc/LINGYUN.Abp.AspNetCore.Mvc.Wrapper/LINGYUN/Abp/AspNetCore/Mvc/Wrapper/Wraping/JsonActionResultWrapper.cs)
- [DefaultExceptionWrapHandler.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/DefaultExceptionWrapHandler.cs)
- [ExceptionWrapContext.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/ExceptionWrapContext.cs)
- [WrapResult.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/WrapResult.cs)
- [WrapResult`T.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/WrapResult`T.cs)
- [AbpWrapperApplicationBuilderExtensions.cs](file://aspnet-core/framework/common/LINGYUN.Abp.AspNetCore.Wrapper/Microsoft/AspNetCore/Builder/AbpWrapperApplicationBuilderExtensions.cs)
- [IgnoreWrapResultAttribute.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/IgnoreWrapResultAttribute.cs)
- [FakeExceptionWrapHandler.cs](file://aspnet-core/tests/LINGYUN.Abp.Wrapper.Tests/LINGYUN/Abp/Wrapper/FakeExceptionWrapHandler.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [配置与使用](#配置与使用)
7. [最佳实践](#最佳实践)
8. [故障排除](#故障排除)
9. [总结](#总结)
## 简介
ABP框架的请求包装功能是一个强大的工具,用于统一处理HTTP请求的结果包装和异常处理。该功能通过标准化的响应格式,确保所有API调用都返回一致的结构化数据,同时提供了灵活的配置选项来控制包装行为。
请求包装系统主要包含以下核心功能:
- **自动结果包装**:将控制器方法的返回值包装成统一的结构化格式
- **异常处理包装**:对未处理的异常进行统一处理并返回标准化的错误信息
- **配置化控制**:通过配置选项精确控制哪些请求需要包装
- **自定义处理器**:支持为特定异常类型注册自定义的包装处理器
## 项目结构
请求包装功能分布在多个模块中,形成了清晰的分层架构:
```mermaid
graph TB
subgraph "通用模块"
Wrapper[AbpWrapper]
WrapperOptions[AbpWrapperOptions]
ExceptionHandler[DefaultExceptionWrapHandler]
end
subgraph "ASP.NET Core模块"
AspNetCoreWrapper[AbpAspNetCoreWrapper]
Middleware[AbpExceptionHandlingWrapperMiddleware]
Filters[AbpWrapResultFilter]
end
subgraph "MVC模块"
MvcWrapper[LINGYUN.Abp.AspNetCore.Mvc.Wrapper]
Wrappers[ActionResultWrapperFactory]
Controllers[控制器包装器]
end
subgraph "测试模块"
Tests[AbpWrapperTests]
Handlers[FakeExceptionWrapHandler]
end
Wrapper --> AspNetCoreWrapper
AspNetCoreWrapper --> MvcWrapper
MvcWrapper --> Wrappers
Wrapper --> WrapperOptions
Wrapper --> ExceptionHandler
Tests --> Handler
```
**图表来源**
- [AbpWrapperModule.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/AbpWrapperModule.cs#L1-L9)
- [AbpAspNetCoreWrapperModule.cs](file://aspnet-core/framework/common/LINGYUN.Abp.AspNetCore.Wrapper/LINGYUN/Abp/AspNetCore/Wrapper/AbpAspNetCoreWrapperModule.cs#L1-L12)
## 核心组件
### AbpWrapperOptions 配置选项
`AbpWrapperOptions`是请求包装系统的核心配置类,提供了丰富的配置选项来控制包装行为:
```csharp
public class AbpWrapperOptions
{
// 未处理异常代码,默认: 500
public string CodeWithUnhandled { get; set; }
// 是否启用包装器,默认: false
public bool IsEnabled { get; set; }
// 成功时返回代码,默认:0
public string CodeWithSuccess { get; set; }
// 资源为空时是否提示错误,默认: false
public bool ErrorWithEmptyResult { get; set; }
// 是否启用401错误包装,默认: false
public bool IsWrapUnauthorizedEnabled { get; set; }
// 包装后的返回状态码,默认:200
public HttpStatusCode HttpStatusCode { get; set; }
// 忽略的URL前缀列表
public IList IgnorePrefixUrls { get; }
// 忽略的命名空间列表
public IList IgnoreNamespaces { get; }
// 忽略的控制器列表
public ITypeList IgnoreControllers { get; }
// 忽略的返回值类型列表
public ITypeList IgnoreReturnTypes { get; }
// 忽略的异常类型列表
public ITypeList IgnoreExceptions { get; }
// 异常处理器字典
internal IDictionary ExceptionHandles { get; }
}
```
**章节来源**
- [AbpWrapperOptions.cs](file://aspnet-core/framework/common/LINGYUN.Abp.Wrapper/LINGYUN/Abp/Wrapper/AbpWrapperOptions.cs#L1-L118)
### WrapResult 结构体
`WrapResult`是包装后返回数据的标准结构,支持泛型以保持类型安全:
```csharp
// 泛型版本
public class WrapResult
{
public string Code { get; set; } // 错误代码
public string Message { get; set; } // 错误提示消息
public string Details { get; set; } // 补充消息
public TResult Result { get; set; } // 返回值
}
// 特化版本
public class WrapResult : WrapResult