NET5 Web应用程序
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来配置处理程序。更多的信息,请参阅应用程序的启动、配置和基本原理.
NET5 Web应用程序的更多相关文章
- 了解ASP.NET5 Web应用程序结构
本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...
- VS2015 ASP.NET5 Web项目
VS2015 ASP.NET5 Web项目结构浅析 前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本 ...
- ASP.NET Core 中文文档 第二章 指南(3)用 Visual Studio 发布一个 Azure 云 Web 应用程序
原文:Getting Started 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安装最新版本的 Azure S ...
- vs2012 发布web应用程序
Visual Studio 2012 Visual Studio Express 2012 for Web 与 的Visual Studio 2010 Visual Studio Web发布更新 与 ...
- web应用程序
1.web应用程序和网站的区别 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来 ...
- Web应用程序的自动化测试库-FluentAutomation
FluentAutomation是流畅的自动化应用编程接口,支持Selenium和WatiN 连同它们所有的风格和驱动程序.自从Fluient支持Selenium,那就意味着你可以使用Selenium ...
- 简化 Web 应用程序与 Windows Azure Active Directory、ASP.NET 和 Visual Studio 的集成
大家好! 今天的博文深入讨论我们今天推出的开发人员工具和框架中的一些新功能.我们通过与 ASP.NET 和 Visual Studio 团队合作开发了一些重大的增强功能,让开发人员能够轻松使用 Win ...
- deployment与Web应用程序部署
定义用于支持 Web 应用程序部署的配置设置. <deployment retail="true|false" /> retail属性:设置一个值,该值指定是否以发布模 ...
- 在Autodesk应用程序商店发布基于浏览器的Web应用程序
你一定已经听说过Autodesk应用程序商店了,通过Autodesk应用程序商店,你可以免费下载或购买来自全球的优秀开发者发布的应用程序,来帮助你更快更方便的完成你的工作.而且作为开发者,您也可以在A ...
随机推荐
- 为什么php时间阅读RTF,p标签会出现红色
为什么php读取富文本的时候,p标签会出现红线,怎么去掉,哪位大侠帮解决?跪求答案 就像以下一样,一遇到p标签就有红虚线 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- HDU 5009 Paint Pearls (动态规划)
Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...
- bzoj 3519: [Zjoi2014] 消棋子 题解
[序言]在大家怀疑的眼光下,我做了一个中午和半个下午.调了一个晚上的题目总算A了! [原题] 消棋子是一个有趣的游戏.游戏在一个r * c的棋盘上进行.棋盘的每一个格 子.要么是空,要么是一种颜色的棋 ...
- ZTESoft 持续集成 编年史 之 持续集成建设---自主研发(总括)
最终选择了自主研发,考虑到我们团队对java以及flex知识的储备,展示层使用夸浏览器的flex开发,后端业务层使用java. 一.方案: BEC + ZCIPAgent + ZCIPServer + ...
- Cocos2d-x3.0 Button
Size widgetSize = Director::getInstance()->getWinSize(); Text* alert = Text::create("Layout& ...
- SWT的TreeVierer的使用
先看一下效果图: 代码结构是这样的: 好的,现在看一下代码: package model; import java.util.List; public interface ITree { public ...
- linux网络编程学习笔记之三 -----多进程并发服务端
首先是fork()函数.移步APUE 8.3. 比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...
- Lua 与C 交换 第一篇
编译 windows上编译lua源代码 cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c del *.o ren lua.obj lua.o ren luac.obj ...
- 【Android UI】案例03滑动切换效果的实现(ViewPager)
本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager.为android.support.v4.view.ViewPager.所以须要在android项目中导入android-su ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...