## 6.8 ASP.NET Core
### 6.8.1 简介
这篇文档是对ABP中集成的ASP.NET Core的描述。ASP.NET 集成是被实现在包 [Abp.AspNetCore](https://www.nuget.org/packages/Abp.AspNetCore) nuget package。
### 6.8.2 Startup Template
你可以从[Startup Template](http://www.aspnetboilerplate.com/Templates)来创建你的项目,该模板是一个空置且简单的web项目,它预先集成且配置好一切可以与ABP框架一起运行。
### 6.8.3 Configuration
#### Startup Class
为了集成ABP到ASP.NET Core,我们应该在 Startup Class 中做一些配置,如下所示:
```csharp
public class Startup
{
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
//配置Abp和依赖注入,在最后调用
return services.AddAbp<MyProjectWebModule>(options =>
{
//配置Log4Net(可选的)
options.IocManager.IocContainer.AddFacility<LoggingFacility>(
f => f.UseLog4Net().WithConfig("log4net.config")
);
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//初始化ABP框架和所有其他模块,这个应该首先被调用
app.UseAbp();
//...
}
}
```
#### Module Configuration
你可以使用[启动配置](225824)来配置AspNet Core模块(在你模块的PreInitialize方法中使用 **Configuration.Modules.AbpAspNetCore()**)
### 6.8.4 Controllers
在ASP.NET Core中控制器可以是任何类类型。它没有限制控制器类必须派生自Controller类,以Controller结尾的类默认为是MVC Controller,例如:ProductController。你也可以使用[Controller]特性添加到任何类上,使该类作为一个控制器。这就是ASP.NET Core MVC的工作方式。详细了解请查看[ASP.NET Core文档](https://docs.asp.net/) 当然已经有贡献者开始翻译该文档https://github.com/dotnetcore/aspnetcore-doc-cn ,详细可以在cnblog中搜索。
如果你要使用web层类如:HttpContext或者返回一个视图,最好的方式是继承 **AbpController** (该类也是派生自MVC的Controller),如果你在创建一个和对象一起工作的API Controller,你可以考虑创建一个POCO Controller类或者可以使用应用层服务作为控制器,如下所述:
#### Application Services as Controllers
ABP提供了基础设施来创建[应用服务](225840)。如果你想你的应用服务作为控制器暴露给远程客户端(正如前面文档描述的使用[动态WebAPI](225846)),你可以很容易的实现,只需要在你模块的 **PreInitialize** 方法中做一个简单的配置,如:
```csharp
Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(MyApplicationModule).Assembly, moduleName: 'app', useConventionalHttpVerbs: true);
```
**CreateControllersForAppServices** 方法会取得指定程序集并转换该程序集下的所有的应用服务作为MVC Controller。你可以使用 **RemoteService** 特性来enable/disable 方法,类或者接口。
当应用服务被转换为MVC Controller时,默认路由模板是:**/api/services/\<module-name\>/\<service-name\>/\<method-name\>** 。例如:如果ProductAppService中定义了一个方法,那么它的URL会是:**/api/services/app/product/create** (假设模块名称是app)。
如果 **useConventionalHttpVerbs** 被设置为 **true** (默认就是这个)。那么通过命名约定对于应用服务的方法所使用的HTTP谓词会被断定为:
+ **Get**:如果方法的名字是以 **Get** 开头
+ **Put**:如果方法的名字是以 **Put** 或者 **Update** 开头
+ **Delete**:如果方法的名字是以 **Delete** 或者 **Remove** 开头
+ **Post**:如果方法的名字是以 **Post,Create** 或者 **Insert** 开头
+ **Path**:如果方法的名字是以 **Path** 开头
+ 否则 **Post** 被作为Http谓词的默认设置
你可以使用任何的 ASP.NET Core 特性来改变HTTP方法或者Action的路由(当然,添加ASP.NET Core package的引用是必须的)。
>注意:首先,动态WebAPI需要应用服务层的服务类必须实现服务层的接口。但是对于ASP.NET Core 的集成不是必须的。所以MVC attributes应该被添加到服务类上,即使你实现了该接口。
### 6.8.4 Filters
ABP为AspNet Core预先构建了一些过滤器,这些过滤器被默认添加到所有控制器的所有的Action上。
#### Authorization Filter
**AbpAuthorizationFilter** 被集成到了 [身份授权认证](225843) 和 [功能管理](225844).
+ 你可以在Action或者Controller上使用 **AbpMvcAuthorize** 特性,在Action执行之前来检查给定的权限是否开启
+ 你可以在Action或者Controller上使用 **RequiresFeature** 特性,在Action执行之前来检查给定的功能是否开启
+ 你可以在Action或者Controller上使用 **AllowAnonymous(或者在应用层使用AbpAllowAnonymous)** 特性来进行匿名访问,避免身份以及授权认证检测
#### Audit Action Filter
**AbpAuditActionFilter** 被集成到[审计日志](225845),默认记录所有对Action的请求。你可以在Action或者Controller上使用特性: **Audited和DisableAuditing** 来控制是否记录日志。
#### Validation Action Filter
**AbpValidationActionFilter** 被集成到[数据传输对象验证](225842) 并且自动为所有Action进行输入验证。除此之外ABP还内置了validation & normalization。它也会检查MVC的 **Model.IsValid** 属性,如果Action的输入有无效的输入值那么它会抛出validation exception。
你可以使在Action和Controller上用特性:**EnableValidation和DisableValidation** 控制validation。
#### Unit of Work Action Filter
**AbpUowActionFilter** 被集成到[工作单元](3.4ABP领域层-工作单元.md),它会在Action执行之前自动开启一个工作单元并且在Action执行完成后完成工作单元(如果没有异常抛出)。
你可以使用特性 **UnitOfWork** 来控制Action的UOW行为。你也可以使用启动配置来改变所有Action上的默认的工作单元特性设置。
#### Exception Filter
**AbpExceptionFilter** 被用来处理来自Controller的Action的异常。它处理并且记录异常信息且返回包裹的响应到客户端。
+ 它仅处理object result,不包括 view result。所以,action返回的任何对象,JsonResult 或者 ObjectResult 将会被处理。Action返回的任何实现自IActionResult视图或者其他结果类型不会被处理。最好是使用定义在Microsoft.AspNetCore.Diagonistics package中内置的 **UseExceptionHandler** 扩展方法来处理视图异常。
+ 可以在方法或者类上面使用 **WrapResult和DontWrapResult** 特性来改变异常处理和日志行为。
#### Result Filter
**AbpResultFilter** 被用来包装Action的返回结果,如果该Action执行成功的话。
+ 它仅对JsonResult,ObjectResult和其它不是实现IActionResult接口对象进行返回结果包装,如果你的Action正在返回一个视图或者其它结果的类型,它不会进行包装。
+ 在方法或者类上面使用 **WrapResult和DontWrapResult** 特性可以enable/disable包装。
+ 你可以在启动配置里面对包装结果的默认行为进行更改
### 6.8.5 Model Binders
**AbpDateTimeModelBinder** 被用来标准化输入时间(可空类型的时间),实际调用 **Clock.Normalize** 方法来实现。
### 6.8.6 Views
MVC视图继承自 **AbpRazorPage**,它自动实现了大多数基础设置的注入(例如:LocalizationManager, PermissionChecker, SettingManager等等)。它也有一些便捷的方法如 **L()** 资源本地化。
### 6.8.7 Client Proxies
ABP能自动的为所有的MVC Controllers创建脚本代理(不仅仅是服务层应用)。它默认为控制器的应用层服务创建脚本代理。你可以在任何的MVC Controller上使用 **[RemoteService]** 特性来创建客户端代理。脚本代理在运行时被动态的创建。你只需要在页面(_Layout.cshtml_)上添加如下代码:
```html
<script src="~/AbpServiceProxies/GetAll?type=jquery" type="text/javascript"></script>
```
当前仅生成了JQuery代理。我们可以使用脚本来调用MVC Action,如下所示:
```javascript
abp.services.app.product.create({
name: 'My test product',
price: 99
}).done(function(result){
//...
});
```
### 6.8.7 集成测试
对于ASP.NET Core的集成测试是相当容易的详细请查阅[文档](https://docs.asp.net/en/latest/testing/integration-testing.html)。ABP遵循这个指导并且在[Abp.AspNetCore.TestBase package](https://www.nuget.org/packages/Abp.AspNetCore.TestBase) 提供了 **AbpAspNetCoreIntegratedTestBase** 类。这使集成测试变得更容易。
最好是在启动模板中通过检查集成测试来查看实际应用情况。
- 文章&教程
- Abp
- 1.1ABP总体介绍-入门介绍
- 1.2ABP总体介绍-多层架构体系
- 1.3ABP总体介绍-模块系统
- 1.4ABP总体介绍-启动配置
- 1.5ABP总体介绍-多租户
- 1.6ABP总体介绍-集成OWIN
- 2.1ABP公共结构-依赖注入
- 2.2ABP公共结构-会话管理
- 2.3ABP公共结构-缓存管理
- 2.4ABP公共结构-日志管理
- 2.5ABP公共结构-设置管理
- 2.6ABP公共结构-时区设置
- 3.1ABP领域层-实体
- 3.2ABP领域层-值对象
- 3.3ABP领域层-仓储
- 3.4ABP领域层-领域服务
- 3.5ABP领域层-工作单元
- 3.6ABP领域层-领域事件
- 3.7ABP领域层-数据过滤器
- 4.1ABP应用层-应用服务
- 4.2ABP应用层-数据传输对象
- 4.3ABP应用层-数据传输对象验证
- 4.4ABP应用层-权限认证
- 4.5ABP应用层-功能管理
- 4.6ABP应用层-审计日志
- 5.1ABP分布式服务-ASP.NET WebApi
- 5.2ABP分布式服务-动态WebApi层
- 5.3ABP分布式服务-集成OData
- 5.4ABP分布式服务-集成SwaggerUI
- 6.1ABP表现层-Mvc控制器
- 6.2ABP表现层-Mvc视图
- 6.3ABP表现层-本地化
- 6.4ABP表现层-导航栏
- 6.5ABP表现层-异常处理
- 6.6.2-AJAX
- 6.6.3-Notification
- 6.6.4-Message
- 6.6.5-UIBlockBusy
- 6.6.6-EventBus
- 6.6.7-Logging
- 6.6.8-OtherUtilities
- 6.6ABP表现层-JavascriptAPI
- 6.7ABP表现层-嵌入资源文件
- 6.8ASP.NET-Core
- 6.9CSRF和XSRF保护
- 7.1ABP后台服务-后台作业和工人
- 7.2ABP后台服务-集成Hangfire
- 8.1ABP实时服务-通知系统
- 8.2ABP实时服务-集成SignalR
- 9.1ABP基础设施层-集成Entity Framework
- 9.2ABP基础设施层-集成NHibernate
- 9.3ABP基础设施层-集成Entity Framework Core
- abp合并版160929
- md文档排版规范
- AbpZero
- 1.1ABPZero-概述
- 1.2ABPZero-安装
- 1.3ABPZero-启动模板
- 1.4ABPZero-启动模板Core
- 2.1ABPZero-多租户管理
- 2.2ABPZero-版本管理
- 2.4ABPZero-组织单位管理