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 新增的一个文件,它描述了项目的基本信息,依赖关系等。

{
"userSecretsId": "aspnet5-FeatureVote-bd1ba2ae-0e4f-4e48-8ffc-fe223c1dc3cd",
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
}, "dependencies": {
"Microsoft.ApplicationInsights.AspNet": "1.0.0-rc1",
"Microsoft.AspNet.Diagnostics": "1.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.Configuration": "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.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 --server.urls=http://localhost:5000"
}, "frameworks": {
"dnx461": { },
"dnxcore50": { }
}, "exclude": [
"wwwroot",
"node_modules"
],
"publishExclude": [
"**.user",
"**.vspscc"
],
"scripts": {
"prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
}
}
  • userSecretsId 是应用程序的一个唯一ID,好像是和加密存储数据有关,具体还不了解。

  • version 描述版本信息。

  • compilationOptions 里边存放应用程序的编译选项,如 emitEntryPoint 用来告诉编译器这是一个应用程序还是一个类库,如果是一个应用程序,则项目代码里便必须要有public static void Main() 方法(见Startup.cs 里边的public static void Main(string[] args) => WebApplication.Run<Startup>(args);)。

  • 另外你还可以指定有关该项目的其他信息,如作者(authors )和说明(description)等。

  • dependencies 描述了项目的依赖关系,依赖项可以是 NuGet 包也可以是其它项目,依赖项版本可以具体制定,也可以使用通配符,使用通配符的时候ikeyi指定大版本,在小版本更新的时候会自动获取最新的小版本(有点像nodenode的包)。

  • commands ASP.NET 5 支持很多命令行工具,该节点配置可以在命令行中运行的命令(例如,启动一个网站或运行测试)。

  • frameworks 该部分指定编译使用的目标框架和一些依赖关系。
    -exclude 用于标记在编译时排除的部分。

  • publishExclude 用于标记在发布网站时排除的部分。

  • scripts 描述自动化构建时的脚本。

global.json 文件

这个文件用来存放解决方案的总体配置信息,默认包含两个配置节:projects 和 sdk

{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-rc1-update1"
}
}
  • projects,指定在哪个文件夹里存放项目的源码

  • sdk,指定Visual Studio打开解决方案时将使用的DNX(.Net Execution Environment)的版本。它在这里设置,而不是在project.json,是为了避免出现一个解决方案中的不同项目使用不同版本的SDK的情况。

wwwroot 文件夹

在ASP.NET 的早期版本中,项目所在的文件夹就是WEB 应用程序的根目录,url请求对应着具体的文件,如http://xxxx/default.aspx , 在后期的版本中,路由概念的加入使url 和 具体文件分离。 但是静态文件的加载(js文件,css文件等)仍然基于它们的目录结构。
这种基于文件的访问方式存在很多问题,比如 如何保护项目的敏感文件不被访问(如:web.config,global.asax),之前一般是采用黑名单的方式保证一些特定的文件或者文件类型不被访问,但是这种方式比白名单的方式安全性要低。 ASP.NET 5还解决了某些文件在测试环境和生产环境是不同版本的问题(如:web.config)。
ASP.NET 5 的wwwroot 就是 WEB应用运行时的目录,一些静态文件,像appsettings.json 没有放在
里边,也就不用担心会被访问到,因此也没有必要创建特殊规则来阻止访问敏感文件。 ASP.NET 5 采用白名单的方式,即只有在wwwroot文件夹中的文件才可以通过Web请求访问。wwwroot文件夹是默认的Web 应用所在的文件夹,如果要使用指定的文件夹,可以在project.json 里配置。

客户端依赖管理

该依赖项文件夹里包含两个子文件夹:bower 和 NPM,这是两个包管理器,他们负责管理获取客户端的依赖项。 展开文件夹,可以看到每个工具目前管理的依赖项及其版本。

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

NET5 Web应用程序的更多相关文章

  1. 了解ASP.NET5 Web应用程序结构

    本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...

  2. VS2015 ASP.NET5 Web项目

    VS2015 ASP.NET5 Web项目结构浅析   前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本 ...

  3. ASP.NET Core 中文文档 第二章 指南(3)用 Visual Studio 发布一个 Azure 云 Web 应用程序

    原文:Getting Started 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安装最新版本的 Azure S ...

  4. vs2012 发布web应用程序

    Visual Studio 2012 Visual Studio Express 2012 for Web 与 的Visual Studio 2010  Visual Studio Web发布更新 与 ...

  5. web应用程序

    1.web应用程序和网站的区别 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来 ...

  6. Web应用程序的自动化测试库-FluentAutomation

    FluentAutomation是流畅的自动化应用编程接口,支持Selenium和WatiN 连同它们所有的风格和驱动程序.自从Fluient支持Selenium,那就意味着你可以使用Selenium ...

  7. 简化 Web 应用程序与 Windows Azure Active Directory、ASP.NET 和 Visual Studio 的集成

    大家好! 今天的博文深入讨论我们今天推出的开发人员工具和框架中的一些新功能.我们通过与 ASP.NET 和 Visual Studio 团队合作开发了一些重大的增强功能,让开发人员能够轻松使用 Win ...

  8. deployment与Web应用程序部署

    定义用于支持 Web 应用程序部署的配置设置. <deployment retail="true|false" /> retail属性:设置一个值,该值指定是否以发布模 ...

  9. 在Autodesk应用程序商店发布基于浏览器的Web应用程序

    你一定已经听说过Autodesk应用程序商店了,通过Autodesk应用程序商店,你可以免费下载或购买来自全球的优秀开发者发布的应用程序,来帮助你更快更方便的完成你的工作.而且作为开发者,您也可以在A ...

随机推荐

  1. wifi,网关相关标识的获取

    获取WIFI的相关信息 - (void)getWifiInfo { NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfa ...

  2. 【测试】使用hr用户下的employees和departments表写一条SQL语句,(MG连接)

    SQL> select * from employees d, departments t where d.department_id=t.department_id; rows selecte ...

  3. 【腾讯Bugly干货分享】RecyclerView 必知必会

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/CzrKotyupXbYY6EY2HP_dA 导语 Re ...

  4. pyopenssl

    https://pyopenssl.readthedocs.org/en/stable/ pyopenssl是一个封装了openssl的python模块. 使用它可以方便地进行一些加解密操作. 1.产 ...

  5. webpack + vue + node 打造单页面(入门篇)

    1.node下载地址:http://nodejs.cn/download/,安装完成检查node和npm版本 2.淘宝镜像 : npm install cnpm -g --registry=https ...

  6. python大法好——多线程

    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...

  7. 关于签名sign的坑

    在有些支付文档或其他文档都会要求签名验证 /** * description:签名 * function name:sign * @param $data * @return string */fun ...

  8. 关于sql优化的一些点

    慢查询日志 参考:https://www.cnblogs.com/saneri/p/6656161.html 查询是否开启慢查询日志: show variables like '%slow_query ...

  9. centos安装discuz论坛

    wget http://download.comsenz.com/DiscuzX/3.3/Discuz_X3.3_SC_UTF8.zip #下载最新版Discuzunzip Dis......zip ...

  10. Python作用域详述

    作用域是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围. python的变量作用域的规则非常简单,可以说是所有语言中最直观.最容易理解的作用域. 在开始介绍作用域之前,先抛一个问题: ...