了解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来配置处理程序。更多的信息,请参阅应用程序的启动配置基本原理.

时间: 2024-10-21 10:12:46

了解ASP.NET5 Web应用程序结构的相关文章

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 项目

VS2015 ASP.NET5 Web项目结构浅析

前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本的Web项目如何,上个周建了项目之后发现真是面目全非,微软这次更新真是太凶了.于是我就有了想简单的了解一下新建的项目结构的冲动,真是一发不可收啊,自己只是想研究个皮毛,这前前后后大概花掉了一周的时间(当然都是业余的)才大致搞明白了一点吧.在此就进行记录一下.首先来创建一个Web项目 1.打开VS2015新建ASP.NET Web应用程序 2.选择ASP.

VS2015 ASP.NET5 Web项目结构分析

前言 1.打开VS2015新建ASP.NET Web应用程序 2.选择ASP.NET 5 Starter Web 3.新建项目后可以发现项目结构如下 可以发现项目结构可以分为1到6六个部分.接下来我就来简单的描述一下我对这6个部分的理解. 1.global.json 1.global.json 文件存放在“Solution Items”解决方案目录下,打开 global.json文件发现,默认有这样的配置: 下面我们来验证一下这个sources的作用.先来做一件事情,下载Asp.Net MVC源

[转] ASP.NET WEB API程序在VS启动或发布到IIS后启动后发生 - Could not load file or assembly &#39;System.Web.Http.WebHost’异常,无法正常访问

Just do Copy Local = true in the properties for the assembly(System.Web.Http.WebHost) and then do a redeploy, it should work fine. http://stackoverflow.com/questions/20323107/could-not-load-file-or-assembly-system-web-http-webhost-after-published-to-

ASP.NET Web 应用程序及页面生命周期

以客户端浏览器向 ASP.NET Web 应用程序页面发送请求(Request)为起点,以浏览器收到 Web 服务器的响应(Response)为终点,这一完整的过程被称为"应用程序及页面的生命周期". ASP.NET Web 页面生命周期开始之前发生了什么? 用户浏览器向 Web 服务器(IIS)发出资源的请求. Web 服务器收到请求,会根据请求文件的扩展名(如 .aspx..ascx..ashx..asmx),指定 ISAPI 扩展来处理该请求,这里提到的扩展名将会由 aspnet

ASP.NET web 应用程序项目

ASP.NET web  应用程序项目 .ashx .ashx.cs aspx包括前台一些代码要处理,ashx可以看作是没有aspx页面中前台代码的后台.cs文件. 没有了前台代码,服务器负担少一点,响应速度相比aspx下就快一些 ashx简洁一点,ashx执行要早于aspx,没有前台页面,减少了控件树的生成 ashx 文件叫“一般处理文件”,这种文件是不带前台界面的,不会生成也不会自带任何的html前台代码,只做一般接收数据处理数据或者返回纯字符串(比如json字串),所以这种文件只会有一个.

asp.net 网站和asp.net Web 应用程序的一处不同

环境为:VS2008Team+.net3.5 asp.net 网站前台页面<%= %>这样绑定可以,asp.net Web 应用程序就不可以 示例代码如下: 1.asp.net网站 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE htm

新建网站与新建Asp.Net Web 应用程序的区别

.net网站和应用程序区别,网站是动态执行的不用编译,他只依赖于自己的文档本身,甚至你用aspx里直接写jsp代码都可以,其实网站可以说只是在.net平台中打开的文档,相当于最初的记事本编码,他并不需要依赖于.net才能执行(当然如果你引用.net自带的类库或工具就需要了),但是项目就需要依赖于.net平台了. 今天新建网站的时候,发现,原来新建网站有两种方法. 1.原来一直用的是直接新建---网站 然后添加后解决方案的项目名称是路径的名称 2.还有一种是新建--项目,然后选web--新建asp

ASP.NET5 Web默认的项目结构浅析(学习笔记)

1.说明 通常一些错误的知识见解发表出来,有可能误导部分读者, 势必造成一定程度伤害. 说实话,试问那个人没有被别人坑过?理解万岁吧!所以本人的博文,如有误人子弟的地方,还望大侠们扶正! 如题,本章的知识点介绍只能算浅析了.理解得对不对?不好说.同样算是我的学习笔记就够了. ASP.NET5 beta7已经发布一个多月了,预计近几天内该发布beta8了. 按照官方产品路线图公布来说,beta8该是所有功能开发大体上盖棺定论(不会大变动了)了. 然后再到RC版,就可用于生产环境中了,这是正式版前,