分布式服务层 - Web API Controllers
5.1 ABP分布式服务 ASP.NET Web API Controllers
5.1.1 简介
ABP已经把 ASP.NET Web API Controllers 集成到了 Abp.Web.Api,你只要通过Nuget安装它。正如你一直那样做得,你可以创建常规的ASP.NET Web API Controllers,
依赖注入可以解析常规的ApiControllers。
为了能够享受使用ABP.Web.Api带来的便利,应该使你的controllers派生自 AbpApiController。
5.1.2 AbpApiController 基类
下面是一个简单的派生自AbpApiController的示例代码:
public class UsersController : AbpApiController
{
}
1. 本地化
为了使本地化更容易,在AbpApiController中定义了一个方法:L;
如下所示:
public class UsersController : AbpApiController
{
public UsersController()
{
LocalizationSourceName = "MySourceName";
}
public UserDto Get(long id)
{
var helloWorldText = L("HelloWorld");
//...
}
}
为了能够使用 L 方法,首先我们应该初始化 LocalizationSourceName。当然,为了不重复初始化该变量,我们可以定义一个继承自AbpApiController的基类,在该类中初始化它,以后所有的Controller类都继承自该基类。
2. 其他
你也可以(pre-inijected)预先注入 AbpSession, EventBus, PermissionManager, PermissionChecker, SettingManager, FeatureManager, FeatureChecker, LocalizationManager, Logger, CurrentUnitOfWork 等基础属性。
3. 过滤器
ABP为ASP.NET Web API定义了一些预先构建的过滤器。默认它们被添加到了所有控制器的所有Action。
4. 审计日志
对于审计日志我们可以使用过滤器:AbpApiAuditFilter。它默认记录请求到所有Actions的日志(如果审计没有禁用)。你可以使用特性 Audited 和 DisableAuditing 来控制控制器的Action是否记录日志。
5. Authorization
你可以用AbpApiAuthorize特性来阻止未授权的用户来访问你的Controllers和Actions。
示例如下:
public class UsersController : AbpApiController
{
[AbpApiAuthorize("MyPermissionName")]
public UserDto Get(long id)
{
//...
}
}
你可以对Action或者控制器来使用 AllowAnonymous 特性来禁用身份认证/授权。
AbpApiController也定义了一个快速检测权限的方法 IsGranted。
详情请参照authorization。
6. 反伪造过滤器
对于POST,PUT以及DELETE的CSRF/XSRF攻击请求,我们可以使用 AbpAntiForgeryApiFilter 来保护ASP.NET WEB API Actions(包括动态Web Api)。详细了解请参考CSRF文档。
7. 工作单元
对于工作单元,我们可以使用 AbpApiUowFilter 过滤器。它会在Action执行之前自动的开启一个新的工作单元,在Action执行之后完成该工作单元(如果没有异常抛出)。
你可以使用 UnitOfWork 特性来控制某个Action的UOW行为。你也可以在启动配置中对所有的Action改变其默认的工作单元特性。
8. 包装返回结果&异常处理
如果action执行成功,ABP 默认 没有对Web API的actions的返回结果进行包装。但是,它对 异常进行了处理和包装。如果需要,你可以添加 WrapResult/DontWrapResult 到actions和控制器上。你可以从启动配置中改变这个默认行为(使用: Configuration.Modules.AbpWebApi()…)。关于对结果包装的了解请参考AJAX文档。
9. 缓存结果
对于Web API请求,ABP添加了 Cache-Control 头(no-cache, no-store)的响应。因此,它阻止浏览器对响应的缓存,即使该请求是GET请求。该行为可以在配置中被禁用。
10. 验证
AbpApiValidationFilter 过滤器自动的检查 ModelState.IsValid 并且阻止action的执行,如果该action没有通过验证。同时,实现了input DTO 的验证,详细了解请阅读数据传输对象验证。
11. 模型绑定
AbpApiDateTimeBinder 过滤器被用来标准化DateTime(以及Nullable\)的输入(使用 Clock.Normalize 方法来标准化 )。