ASP.NET5 Web应用程序结构
本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习。
ASP.NET 5 针对WEB编程引入了几个新的基本概念,理解这些概念对快速开发WEB应用来说很重要。或许这些这些概念对你来说不是新的,但是对那些使用ASP.NET 和 Visual Studio 进行传统的WEB应用开发的程序员来说,这些概念可能是新的。
本文主要内容包括:
-
ASP.NET 项目结构
-
Framework 运行时
-
project.json 文件
-
global.json 文件
-
wwwroot 文件夹
-
客户端依赖管理
-
服务端依赖管理
-
应用程序启动
ASP.NET 项目结构
跟之前的ASP.NET解决方案相比,ASP.NET 5 多了一个 Solution Items 文件夹,里边有一个global.json 文件,而 WEB 项目被放在一个 src 文件夹中。新的结构里有一个特殊的
文件夹,并增加了 这样一个节点。
打开项目的根目录,发现增加了若干个新文件: bower.json, appsettings.json, gulpfile.js, package.json, project.json 和Startup.cs等。
同时,细心的童鞋会发现 global.asax, packages.config, web.config 这些文件都不见了。在 ASP.NET之前的版本中这些文件保存了大量的应用程序配置信息。但在ASP.NET5,这些信息和逻辑已经被重构到了更小,更集中的文件里。
运行时目标框架
ASP.NET 5 可在两种运行时环境中工作:传统的.NET Framework 和新的 .NET Core,默认情况下,应用程序将使用 .NET Framework 的完整版本运行。但我们也可以选择使用 .NET Core 版本。
你可以在项目上 右键>属性 来查看当前项目使用的运行时。
.NET Core— 是 .NET Framework 一个子集,是一个新的,模块化的(利用NuGet),跨平台的更小体积的运行时。使用 .NET Core 你可以为你的每一个应用程序部署其专有的.NET 运行时,也就是说你的应用程序将以部署的运行时版本运行,而不是以主机操作系统上安装的运行时版本运行。一个应用程序的运行时的版本可以和其他应用程序的运行时版本不同并且可以并行运行。如果有需要你可以更新某个应用程序的运行时,但不会影响其他的应用程序。这将使得应用程序部署和架构更新变得更加简单,而且较少影响运行在系统上的其他应用程序。
.NET Framework— 目前.NET Core的API较之完整的.NET Framework还有很多的不足,因此大多数传统的应用程序在ASP.NET 5 下只能使用完整版本的 .NET Framework运行,原因就是它们依赖的一些组件或类库在.NET Core 中还没有。 使用 .NET Framework 现有的应用程序和库将继续在运行时工作而不需要任何更改。
project.json 文件
这是 ASP.NET 5 新增的一个文件,它描述了项目的基本信息,依赖关系等。
bower 和 NPM 的具体功能网上有很多介绍,这里不做详细描述。
服务器端依赖管理
在解决方案资源管理器的引用文件夹下详细展示了项目的引用项。这应该是大家比较熟悉的。不同点是它引用了两个目标框架:完整的 DNX 4.5.1和 DNX Core 5.0,每个目标框架都有各自的引用关系,并且通过图标可以区分出来引用的是一个组件还是一个NuGet 资源包或者是其它项目。这些依赖将在编译的时候进行检查,丢失的依赖项会从配置的NuGet包源(工具>NuGet包管理器>程序包管理器设置>程序包源)进行下载。
应用程序启动
ASP.NET 5将程序分解为各种模块,这些模块可以按需单独的添加到WEB应用程序里边。这使得程序更加精简。 如果你使用空模板创建一个 ASP.NET 5 应用,你会发现 Startup.cs 文件只有简单的几行代码。 默认的WEB项目里 startup
类 把 configuration, MVC, EF, Identity services, logging, routes等处理程序连接起来. 它提供了一个很好的例子展示如何配置使用你的ASP.NET应用程序。startup
类 样例里边包含三个部分:构造函数,ConfigureServices
和 Configure
Configure
方法在ConfigureServices
方法之后被调用,用于配置中间件。
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); if (env.IsDevelopment())
{
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
} builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
我们可以在构造函数里边看到应用是如何处理配置文件的。Configuration 是 startup
类的一个属性,配置信息可以从各种来源(如JSON、XML或环境变量)来获取,默认的模板中使用ConfigurationBuilder
通过appsettings.json 和环境变量信息来创建一个IConfiguration
实例,您也可以编写自己的自定义configuration provider
, 可参考 Configuration。ConfigureServices
方法被用来指定哪些服务被提供给应用程序使用。在默认的模板里添加了3种服务: EF, Identity 和 MVC ,这里你可以根据需要来添加自己的服务。
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddMvc(); // Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
Configure
方法在ConfigureServices
之后被运行时调用,在示例项目中,Configure
调用控制台来做日志。为开环境添加了几个有用的功能,添加了静态文件、身份和MVC路由的支持,注意,只在ConfigureServices 中添加身份 和 MVC 还不够,它们还需要通过调用Configure
在请求管道中配置。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug(); if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error"); // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch { }
} app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear()); app.UseStaticFiles(); app.UseIdentity(); // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715 app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
你能看到,配置哪些服务是可用的,以及如何配置请求管道这些都完全是由Startup
类来完成,而不是使用 HTTP 模块和通过web.config来配置处理程序。更多的信息,请参阅应用程序的启动、配置和基本原理.
分类: asp.net5