[关闭]
@muyanfeixiang 2016-01-13T20:09:23.000000Z 字数 4084 阅读 1538

理解ASP.NET 5 Web Apps

ASP.NET-5 开源


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,如下
framework
Debug模式下 Use Specific Runtime是默认没有选中的,选中它,就可以选择Version, Platform, and Architecture。

Project.json文件

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

  1. {
  2. "userSecretsId": "aspnet5-WebApplication1-8479b9ce-7b8f-4402-9616-0843bc642f09",
  3. "version": "1.0.0-*",
  4. "compilationOptions": {
  5. "emitEntryPoint": true
  6. },
  7. "dependencies": {
  8. "EntityFramework.Commands": "7.0.0-rc1-final",
  9. "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
  10. "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
  11. "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
  12. "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
  13. "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
  14. "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
  15. "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
  16. "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
  17. "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
  18. "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
  19. "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
  20. "Microsoft.Extensions.Configuration.FileProviderExtensions" : "1.0.0-rc1-final",
  21. "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
  22. "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
  23. "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
  24. "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
  25. "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
  26. "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
  27. },
  28. "commands": {
  29. "web": "Microsoft.AspNet.Server.Kestrel",
  30. "ef": "EntityFramework.Commands"
  31. },
  32. "frameworks": {
  33. "dnx451": { },
  34. "dnxcore50": { }
  35. },
  36. "exclude": [
  37. "wwwroot",
  38. "node_modules"
  39. ],
  40. "publishExclude": [
  41. "**.user",
  42. "**.vspscc"
  43. ],
  44. "scripts": {
  45. "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  46. }
  47. }

userSecretsId是作为web app的唯一标识,详见Safe Storage of Application Secrets
version指定了项目的当前版本号,你也可以指定authors和description等元信息。
你可以使用compilationOptions来设置应用,如 languageVersion and useOssSigning.
最典型的是dependencies中值,这些是引用的安装Nuget包或对其他项目的依赖。包版本号也是指定的,当然也可以使用通配符来指定版本好。

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

  1. "commands": {
  2. "web": "Microsoft.AspNet.Server.Kestrel",
  3. "ef": "EntityFramework.Commands"
  4. },

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

  1. {
  2. "projects": [ "src", "test" ],
  3. "sdk": {
  4. "version": "1.0.0-rc1-final"
  5. }
  6. }

前者指定了哪个文件夹包含了项目源码。默认情况下是还在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特定的应用逻辑而不是前端需要加载的静态文件(意味这静态文件还是依赖文件位置)。
static files

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

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

client端的依赖管理

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注