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<DateTime>)的输入(使用 Clock.Normalize 方法来标准化 )。