来源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.

理解ASP.NET 5 Web Apps的更多相关文章

  1. [翻译]理解 ASP.NET 5

    **原文:http://docs.asp.net/en/latest/conceptual-overview/understanding-aspnet5-apps.html** 英文捉急,花了挺多时间 ...

  2. Asp.net与office web apps的整合

    其实网上有关office web app的整合已经有相关的文章了,典型的是如何整合Office Web Apps至自己开发的系统(一) 和如何整合Office Web Apps至自己开发的系统(二), ...

  3. 整合Office Web Apps至自己的开发系统

    原文出处:http://www.cnblogs.com/poissonnotes/p/3267190.html 还可参考:https://www.cnblogs.com/majiang/p/36729 ...

  4. Azure 部署 Asp.NET Core Web App

    在云计算大行其道的时代,当你在部署一个网站时,第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core 的网站呢?Azure 的 Web A ...

  5. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...

  6. ASP.NET MVC Web API For APP

    近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...

  7. 在线文档预览方案-office web apps

    最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...

  8. (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?

    Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...

  9. [转载]在线文档预览方案-Office Web Apps

    最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...

随机推荐

  1. event.returnValue=false与event.preventDefault()

    event.preventDefault()方法是用于取消事件的默认行为,但此方法并不被ie支持,在ie下需要用window.event.returnValue = false; 来实现. funct ...

  2. Tomcat学习笔记(六)

    Tomcat日志 网上找到一篇分析不错的博文   http://peiquan.blog.51cto.com/7518552/1580189/

  3. 02 Java 基础语法

    在开始 Java 基本语法之前,先说明 Java 程序的基本规范: 大小写敏感,例如 Person 和 person 是不同的 类名首字母大写,如果类名由多个单词组成,每个单词首字母都大写,例如 He ...

  4. Http错误大全

    HTTP/IIS错误类型 1XX 信息提示 用于表示临时的响应.客户端在收到常规响应之前,应准备接受一个或多个1XX响应. 100 :继续101 :切换协议 2XX 成功 表示服务器成功地接受了客户端 ...

  5. CSS Sprites技术

    CSS Sprites技术,国内很多人也叫雪碧图,因为sprite麻 (你买一瓶雪碧就看得到大大的sprite字样了) 主要用于将网站的零碎图标的img标签取代,因为每个img标签引用的src就会造成 ...

  6. linxu安装方式

    安装Linux操作系统的5种方法以及心得这几天没有调别的东西,想起自己还不太会在没有安装光盘的时候安装Linux,于是试了一下Linux的五种安装方法,下面是我的一些 篇一:安装Linux操作系统的5 ...

  7. bootstrap3基本了解

    使用 BootCDN 提供的免费 CDN 加速服务(同时支持 http 和 https 协议) Bootstrap 中文网 为 Bootstrap 专门构建了免费的 CDN 加速服务,访问速度更快.加 ...

  8. CodeForces 659D Bicycle Race (判断点是否为危险点)

    D - Bicycle Race Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...

  9. 我的代码,写的pagebase。还是留着吧。语义化,与我的云平台一样,只不过云平台是用js写的。这个是webform.下回写mvc吧。核心很简单。

    Ps:记一下用的时候,一不小心我手贱碰到的问题吧:我在页面里面加上了form runat=server,然后所有的html控件就再也找不着了.就是下面的control collection这里,如果加 ...

  10. struts2 json 输出日期格式不正确

    struts2 输出json中 日期出现:2013-12-17T15:57:47 错误格式的数据 原因:struts2 json插件对日期的格式化有问题 解决方法:在实体类的日期的get方法上加注解: ...