您的位置:首页 > 移动开发

理解ASP.NET 5 Web Apps

2016-01-14 10:46 363 查看
来源https://docs.asp.net/en/latest/conceptual-overview/understanding-aspnet5-apps.html

ASP.NET 5引入了几个新的基础概念,理解这些概念对于创建应用很重要。这些概念在web开发上也许不是新的,但是对于ASP.NET却是新的。所以对很多已ASP.NET为平台的web开发这来说很有可能是一些新概念。

ASP.NET项目结构

ASP.NET 5的项目结构引入了一些新的概念,替换掉了一些legacy的元素。全新的默认web项目模板结构如下



新的模板首先包含了Solution Items文件夹,并且包含一个global.json文件。项目则是位于src文件夹下面。新的结构也包括了wwwroot文件夹和Dependencies部分。而References部分也是经过更新的。在项目根目录下包括了 bower.json, appsettings.json, gulpfile.js, package.json, project.json, and Startup.cs这几个文件,而global.asax,package.config以及web.config则是不见了。在之前的版本中很多应用配置是依赖于这些文件的。在ASP.NET 5 中这些信息和逻辑则是经过分解、重构,放到了更细粒度的文件中了。

Framework Target

ASP.NET 5可以针对多个framework,使应用可以部署到不同host环境。默认情况下,是以完整板的.NET为作为框架,但是也可以只针对.NET Core。大部分遗留项目还是依赖完整版本的framework。

你可以通过项目属性来看当前针对framework,如下



Debug模式下 Use Specific Runtime是默认没有选中的,选中它,就可以选择Version, Platform, and Architecture。

Project.json文件

这个文件定义了项目服务端的依赖以及别项目特定的信息。默认项目模板中,project.json中最顶层的默认部分如下

{
"userSecretsId": "aspnet5-WebApplication1-8479b9ce-7b8f-4402-9616-0843bc642f09",
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},

"dependencies": {
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
"Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
},

"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},

"frameworks": {
"dnx451": { },
"dnxcore50": { }
},

"exclude": [
"wwwroot",
"node_modules"
],
"publishExclude": [
"**.user",
"**.vspscc"
],
"scripts": {
"prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
}
}

userSecretsId是作为web app的唯一标识,详见Safe Storage of Application Secrets

version指定了项目的当前版本号,你也可以指定authors和description等元信息。

你可以使用compilationOptions来设置应用,如 languageVersion and useOssSigning.

最典型的是dependencies中值,这些是引用的安装Nuget包或对其他项目的依赖。包版本号也是指定的,当然也可以使用通配符来指定版本号。

ASP.NET 5对命令行工具有了很多支持,通过commands部分可以允许你配置一些命令(如运行web程序或者运行测试)。

"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},

frameworks指定了构建的目标framework以及framework的依赖。如果你要使用LINQ和collections,在使用.NET Core构建时,就要确保把他们加进dnxcore50的依赖列表里。

exclude用来指定那些文件和文件夹应排除在构建之外。

同样的publishExclude则是指定那些内容不应包括在发布内。

scripts部分构建时,应该运行哪些自动化脚本。现在vs内建支持特定事件前或者后的脚本运行。The default ASP.NET project template has scripts in place to run during postrestore and prepare that install client side dependencies using npm and bower。详情见Manage Client-Side Packages with Bower.

global.json文件

这个文件是用来配置整个解决方案的。主要包括projects和sdk

{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-rc1-final"
}
}

前者指定了哪个文件夹包含了项目源码。默认情况下是还在src文件夹,并且讲build artifacts放在src同级文件夹中,使得可以把他们从源码控制中方便的排除。如下



sdk则是指定了DNX版本。放在global.json而不是project.json是避免同一解决方案中的项目却target不同版本的sdk,详见DNX Overview

wwwroot文件夹

在之前的ASP.NET中,项目的根目录就是web应用的根目录。起先webform时,将default.aspx放在项目根目录下,有默认请求(不带参数 )进来就会加载default.aspx。后来有了路由,解耦了url和实际文件路径。然而路由是ASP.NET特定的应用逻辑而不是前端需要加载的静态文件(意味这静态文件还是依赖文件位置)。



基于文件的方法带来了一些问题。

首先,文件安全。如果想要保护敏感文件,需要在framework-level来通过名字或者扩展名来保护特定文件,如web.config或者global.asax等。需要对sensitive的文件设置黑名单来保护,然后黑名单却没有白名单安全(只允许对特定的文件有访问权限而不是只不允许访问特定的文件)。而且一些配置文件针对不同环境(生产\测试),一些scripts脚本在不同环境下格式也是不同的。在先前的文件结构中,处理这些情况都是比较困难的。

在ASP.NET 5的wwwroot文件夹中,这个文件夹是web应用的根目录,静态文件如appsetting.json是不包括在wwwrooot中的,因此是不可访问的,也就没必要创建特殊的规则来保护sensitive文件。采用了更安全的白名单,只有wwwroot中的文件可以通过web请求访问。虽然wwwroot默认是web根目录,不过也是可以通过project.json来配置修改的。

client端的依赖管理

Dependencies文件夹有两个子文件夹Bower和NPM,对应着两个包管理工具,可以用来管理客户端依赖和工具(eg..jQuery,Bootstrap,Gulp)。两个子文件夹内是每个工具所管理的依赖项。



bower的依赖项是有bower.json控制,它位于wwwroot/lib下面的每个子文件夹下。



每个依赖项都是通过它对应bower.json来具体配置。详见 Client-Side Development.

server端依赖

Solution Explorer下面的References目录,详细说明了项目服务端依赖。虽然类似于以前的references,但还是有不同的。References是根据不同版本的framework,来将依赖也是独立分开的,比如对与DNX4.5.1和.DNX Core 5.0,每个目标framework都有各自的依赖项,而且依赖项图标 标识了依赖项是assembly,还是NuGet包,还是项目。依赖项会在编译时检查,并会从配置的NuGet包源地址来下载缺失的包(specified under Tools > NuGet Package Manager > Package Manager Settings > Package Sources)。



应用启动(startup)

ASP.NET 5将特性集分解到不同的模块中,这些模块可以单独的应用到web应用中。这样就可以让lean web apps不用引用不需要的特性。当ASP.NET应用启动时,ASP.NET运行时调用Startup类中的Configure方法。默认web项目中的Startup类中连接了配置,MVC,EF,Identity services,logging,routes以及其他更多。在样例Startup类中,有三部分,一个构造器,ConfigureServices和Configure。Configure方法是在ConfigureServices方法之后调用,是用来配置中间件的。

构造器指定了app怎么处理配置。Configuration是Startup类的一个属性,可以从各种文件格式以及环境变量来读取。默认项目模板使用ConfigurationBuilder来构建一个IConfiguration实例,来加载appsettings.json和环境变量。更多详见Configuration.

public Startup(IHostingEnvironment env)
{
// Set up configuration providers.
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();
}

ConfigureServices是用来指定哪些服务是app可用的。默认模版中,使用helper method添加了各种服务,如EF,Identity和MVC他们所需的服务。 This is also where you can add your own services, as we did above to expose the configuration as a service。完整的ConfigureServices方法如下(including the call to add Configuration as a service),

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用来链接了控制台logger和其他几个有用的开发环境特性。并支持static files,Identity和MVC。注意,添加Identity和MVC到ConfigureServices里是不够的,他们也需要通过Configure在request请求管道中配置

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?}");
});
}

如你所见,配置服务和request管道都是在Startup类中进行的,而不是使用web.config中的Htpp Modules和Handlers。For more information, see Application Startup, Configuration and Fundamentals.

总结

ASP.NET 5 introduces a few concepts that didn’t exist in previous versions of ASP.NET. Rather than working with web.config, packages.config, and a variety of project properties stored in the .csproj/.vbproj file, developers can now work with specific files and folders devoted to specific purposes. Although at first there is some learning curve, the end result is more secure, more maintainable, works better with source control, and has better separation of concerns than the approach used in previous versions of ASP.NET.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: