ASP.NET 5 Web 应用程序的初学者步骤以及新功能介绍






4.64/5 (13投票s)
在本文中,我们将介绍如何以及在哪里下载 Visual Studio 2015 来创建一个全新的简单 Asp.Net 5 Web 应用程序,并快速了解 C# 6 中的新增功能。
下载 AspNet2015.zip
引言
在本文中,我们将介绍如何
- 下载 Visual Studio 2015
- 创建全新的简单 Asp.Net 5 Web 应用程序
- 对 Web 项目结构中的新增功能进行高层概述,以及
- 新的 C# 6 功能
下载 Visual Studio 2015
Visual Studio 2015 是 Microsoft 的最新更新,包含新的 .Net 4.6 框架。我使用 Visual Studio 2015 的发布候选版 (RC) 来分析和检查本文的项目结构。在我完成本文时,Microsoft 已发布 Visual Studio 2015 的正式版 (RTM),您可以在此处下载。
创建新的简单 ASP.NET 5 Web 应用程序
与 Visual Studio 中的其他项目一样,我们通过创建一个名为“AspNet2015”的 ASP.NET Web 应用程序来开始,.Net 框架版本为 4.6。
在模板窗口中,我们将从“ASP.NET 5 预览模板”下选择网站模板。请注意,所有复选框(Web Forms、MVC 和 Web API)都已禁用。原因是在新的 ASPNET 5 中,MVC 控制器和 API 控制器都称为控制器。此外,我们可以在 MVC 项目中拥有 .aspx Web Forms。
在此演示应用程序中,我们不关注任何类型的身份验证。因此,我们将身份验证更改为“无身份验证”,以避免分心于身份验证控制器及其相应的视图。
创建新项目后,Visual Studio 会立即执行其引导程序代码来生成整个解决方案。与以前的版本和模板不同,Visual Studio 团队对项目结构进行了全面改革,添加了新概念并替换了一些旧概念。这是项目结构
项目加载后,它首先在引用下恢复Dot Net Executable (DNX) 和 DNX Core 5.0 库。
此外,它还会恢复外部客户端包,如 CSS 和 JS 文件及其依赖项。如果未恢复,我们可以随时右键单击Bower和NPM来恢复包。
现在,构建并运行应用程序,在浏览器中查看。每次构建之前,项目都会恢复所有必要的服务器端和客户端包。这是我们的新 Asp.Net 5 应用程序在常规浏览器中的外观
这是它在响应式(移动)设备中的外观
对 ASP.NET 5 项目结构中的新增功能进行高层概述
Asp.Net 团队进行了许多架构更改,使核心 Web 框架更加精简和模块化。它不再基于System.Web.dll,而是基于一组细粒度和结构良好的 NuGet 包。ASP.NET 5 在构建 Web UI 和 Web API 时,考虑到了现代 Web 应用程序的需求。通过引入基于环境的配置和提供内置依赖项注入支持,实现云就绪。它现在支持更广泛的开发人员,支持 Windows、Mac 和 Linux 上的跨平台开发。它有一个简单的内置控制反转 (IoC) 容器,默认支持构造函数注入。
以下是一些亮点:
- 新的轻量级、模块化 HTTP 请求管道
- 可在 IIS 中托管,或在自己的进程中自托管
- 基于 .NET Core 构建,支持真正的应用程序版本并行
- 完全以 NuGet 包的形式发布
- 集成支持创建和使用 NuGet 包
- Web UI 和 Web API 的单一统一 Web 堆栈
- 云就绪的环境配置
- 内置依赖项注入支持
- 新的工具简化了现代 Web 开发
- 在 Windows、Mac 和 Linux 上构建和运行跨平台 ASP.NET 应用程序
- 开源且以社区为中心
Project.json
Project.json 文件用于定义项目的服务器端依赖项以及其他项目特定信息。
{
"webroot": "wwwroot",
"version": "1.0.0-*",
"dependencies": {
"Microsoft.AspNet.Diagnostics": "1.0.0-beta4",
"Microsoft.AspNet.Mvc": "6.0.0-beta4",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta4",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta4",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta4",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta4",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta4",
"Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
"Microsoft.Framework.CodeGenerators.Mvc": "1.0.0-beta4",
"Microsoft.Framework.Logging": "1.0.0-beta4",
"Microsoft.Framework.Logging.Console": "1.0.0-beta4",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta4"
},
"commands": {
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls https://:5000",
"gen": "Microsoft.Framework.CodeGeneration"
},
"frameworks": {
"dnx451": { },
"dnxcore50": { }
},
"exclude": [
"wwwroot",
"node_modules",
"bower_components"
],
"publishExclude": [
"node_modules",
"bower_components",
"**.xproj",
"**.user",
"**.vspscc"
],
"scripts": {
"postrestore": [ "npm install", "bower install" ],
"prepare": [ "gulp copy" ]
}
}
webroot 部分指定充当网站根目录的文件夹,按约定默认为 wwwroot 文件夹。version 属性指定项目的当前版本。我们还可以指定有关项目的其他元数据,如作者和描述。frameworks 部分指定将构建的目标框架以及需要包含的依赖项。exclude 部分用于标识应从构建中排除的文件和文件夹。BundleExclude 用于标识打包站点时应排除的项目内容部分。scripts 部分用于指定何时运行某些构建自动化脚本。Visual Studio 现在内置支持在特定事件之前和之后运行此类脚本。
Global.json
global.json 文件用于配置整个解决方案。
{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-beta4"
}
}
projects 属性指定包含解决方案源代码的文件夹。默认情况下,项目结构将源文件放在 src 文件夹中。sdk 属性指定 Visual Studio 打开解决方案时将使用的 DNX(.Net 执行环境)版本。
wwwroot 文件夹
在以前版本的 ASP.NET 中,项目的根目录通常是网站的根目录。在后来的 ASP.NET 版本中,添加了路由支持,从而可以将文件位置与其对应的 URL 分离开来。但是,这种路由仅用于 ASP.NET 特定的应用程序逻辑,而不用于静态文件。图像、脚本文件和样式表等资源通常仍基于其位置加载。
必须专门阻止(也称为黑名单)对某些文件的访问,这比仅授予对应可访问文件的访问权限(也称为白名单)安全性要差得多。
wwwroot 文件夹代表 Web 服务器运行时 Web 应用程序的实际根目录。位于 wwwroot 之外的静态文件(如 config.json)将永远无法访问,无需创建特殊规则来阻止敏感文件(黑名单访问)。除了安全优势外,wwwroot 文件夹还简化了常见的任务,如打包和最小化过程。
依赖项
Dependencies 文件夹包含两个子文件夹:Bower 和 NPM。这些文件夹对应于同名的两个包管理器,用于获取客户端依赖项和工具。
bower 依赖项由 bower.json 文件控制。每个依赖项在其自己的部分中进一步配置于 bower.json 文件中,指示在执行 bower 任务时如何将其部署到 wwwroot 文件夹。
{
"name": "ASP.NET",
"private": true,
"dependencies": {
"bootstrap": "3.0.0",
"jquery": "1.10.2",
"jquery-validation": "1.11.1",
"jquery-validation-unobtrusive": "3.2.2",
"hammer.js": "2.0.4",
"bootstrap-touch-carousel": "0.8.0"
}
}
默认情况下, Bower 任务使用 gulp 执行,gulp 在 gulpfile.js 中进行配置。当前 Web 模板的 gulpfile 包括将脚本和 CSS 文件从 bower 文件夹复制到 wwwroot 中的 /lib 文件夹的任务。这是 gulpfile.js
/// <binding Clean='clean' />
var gulp = require("gulp"),
rimraf = require("rimraf"),
fs = require("fs");
eval("var project = " + fs.readFileSync("./project.json"));
var paths = {
bower: "./bower_components/",
lib: "./" + project.webroot + "/lib/"
};
gulp.task("clean", function (cb) {
rimraf(paths.lib, cb);
});
gulp.task("copy", ["clean"], function () {
var bower = {
"bootstrap": "bootstrap/dist/**/*.{js,map,css,ttf,svg,woff,eot}",
"bootstrap-touch-carousel": "bootstrap-touch-carousel/dist/**/*.{js,css}",
"hammer.js": "hammer.js/hammer*.{js,map}",
"jquery": "jquery/jquery*.{js,map}",
"jquery-validation": "jquery-validation/jquery.validate.js",
"jquery-validation-unobtrusive": "jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"
}
for (var destinationDir in bower) {
gulp.src(paths.bower + bower[destinationDir])
.pipe(gulp.dest(paths.lib + destinationDir));
}
});
服务器端依赖项
references 文件夹包含服务器端依赖项。在 Asp.Net 5 中,我们看到两个不同的框架依赖项:ASP.NET 5.0 vs. ASP.NET Core 5.0。每个引用图标都表示它是NuGet 包还是项目。所有依赖项都会在编译时进行检查,任何缺失的引用都会从 NuGet 中恢复。
配置
作为 .Net 开发人员,多年来一直未改变的一件事是应用程序配置(web.config 或 machine.config)文件,通常采用 XML 格式。ASP.NET 5 使用新的配置模型来处理基于简单名称-值对的配置,该模型不基于 System.Configuration 或 web.config。内置的配置提供程序支持各种文件格式(XML、JSON 和 INI)以及环境变量,以实现基于环境的配置。您可以根据应用程序的需要添加任意数量的不同配置文件。您还可以编写自己的自定义配置提供程序,以适应不同的环境,如开发、QA 和生产等。
应用程序启动
项目 Startup.cs 类负责配置、MVC、EF、Identity 服务、日志记录、路由等。通过它,我们可以添加为项目增加价值的模块,并跳过不需要的模块,从而构建一个精简的 Web 项目。
示例启动类包含三个部分:构造函数、ConfigureServices 和 Configure。构造函数指定应用程序如何处理配置。ConfigureServices 方法用于指定应用程序可用的服务。最后,在 ConfigureServices 之后调用 Configure 方法,并用于配置中间件。
ASP.NET 5 中的服务有三种类型:单例、作用域和瞬时。瞬时服务每次从容器请求时都会创建。作用域服务仅在当前作用域中尚不存在时才创建。对于 Web 应用程序,每个请求都会创建一个容器作用域,因此您可以将作用域服务视为每个请求。单例服务仅创建一次。
K Command Codenames, DNX 和 DNX Core
K 是.NET Core Version 1 的代号。在命令行运行应用程序时也使用。K 命令是您访问运行时的入口点。
DNX 就是.NET Execution Environment。它的代号是“K”命令行工具。
KPM – Core Package Manager。现在它被表示为DNU (Dot Net Updater)。包管理器 KPM 是用于恢复包、安装包、打包应用程序以进行部署等的命令,这意味着与使用包或使用packages.json 文件打包应用程序相关的任何操作。
KLR – Core Language Runtime。KLR.exe 将用于诸如从命令行构建和运行等场景,例如在开发环境中自托管时。
KRE – Core Runtime Engine。现在称为DNX (Dot Net Executable Runtime)。KRE 用于使用projects.json 文件引导和运行 ASP.NET 环境。您可以使用 KVM 来获取和管理 KRE 版本。
KVM – Core Version Manager。现在称为DNVM (Dot Net Version Manager)。KVM 是一个 PowerShell 脚本,用于获取运行时并管理机器上同时存在的多个运行时版本。通过它可以升级到最新版本并根据需要切换版本。
包管理器 (DNU)依赖于运行时引擎 (DNX),而运行时引擎 (DNX)又依赖于版本管理器 (DNVM)。
那么 C# 6 有什么新特性?
Roslyn 编译器
Asp.Net5 最棒的地方就是 Roslyn 编译器。要完全讨论 Roslyn,我们需要查看github。
静态 Using:使用命名空间的静态 using,从而在访问方法、属性等时省略完全限定名。
旧
Console.WriteLine("Hello World");
新建
// Declaring Namespace
Using static System.Console;
// Somewhere in the code
WriteLine("Hello World ");
自动属性初始值设定项:而不是创建带 setter 的构造函数,例如
旧
public Customer()
{
customerID = Guid.NewGuid();
}
新建
public Guid customerId { get; set; } = Guid.NewGuid();
字典初始值设定项:新的字典初始值设定项将消除在设置与其对应键元素的值时产生的任何混淆。
旧
public Dictionary<string,string> custNames = new Dictionary<string,string>()
{
{"Sree", "Chess" },
{"Vamsi","Carom"}
};
新建
public Dictionary<string,string> custNames = new Dictionary<string,string>()
{
["Sree"] = "Chess",
["Vamsi"] = "Carom"
};
Try...Catch 块中的选择性异常:根据特定条件处理异常的选择。
新建
try{
throw new Exception("More Bad");
}
catch(Exception ex) if (ex.Message == "Some Bad Ex"){
// Handle exception in A way
}
catch (Exception ex) if (ex.Message == "More Bad"){
// Handle exception in Another way
}
错误处理中的 Async/Await
public void func(){
Task task = new Task(SomeFunc);
task.start();
task.wait();
}
public static async void SomeFunc(){
try{
throw new Exception("Error");
}
catch{
await Task.Delay(2000);
}
finally{
await Task.Delay(2000);
}
}
nameOf 表达式
旧
if (name!=null) throw new Exception("name");
新建
if (name != null) throw new Exception(nameOf(name));
字符串插值
旧 1
Console.WriteLine("Name : "+ fName + " " + lName);
旧 2
WriteLine(string.Format("Name : {0} {1}",fname, lName);
新建
WriteLine($"Name : {fName} {lName}");
在后续版本中,我们可能会在 C# 中看到更多类似 AngularJS 的语法。
“依赖项注入”使用控制反转 (IoC) 的默认实现:如果您查看 Startup.cs 文件,构造函数本身就是通过传递接口 IHostingEnvironment 作为参数而不是创建对象来实现依赖项注入。
public class Startup
{
public Startup(IHostingEnvironment env)
{
// Setup configuration sources.
Configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
}
// some other configuraton code
}
环境标签:使用 <environment> 标签根据所选环境渲染 CSS 和 JavaScript 库。
<environment names="Development">
<link rel="stylesheet" href="~/lib/bootstrap/css/bootstrap.css" />
<link rel="stylesheet" href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
asp-controller 和 asp-action 的用法:Asp.Net5 团队现在简化了 Razor 语法和 @Html 辅助函数,以便不熟悉 Razor 语法的人(如前端开发人员等)能够理解并相应地进行工作。通过向 anchor 或 form 标签添加asp-controller 和 asp-action 属性。
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a asp-controller="Home" asp-action="Index">Home</a></li>
<li><a asp-controller="Home" asp-action="About">About</a></li>
<li><a asp-controller="Home" asp-action="Contact">Contact</a></li>
</ul>
</div>
这是新的 <Form> 标签
<form asp-controller="Account" asp-action="Register" method="post" class="form-horizontal" role="form">
Some html form content
<form>
使用 Async 渲染部分视图:新的 @async 语法和辅助函数用于加载部分视图
@await Html.PartialAsync
// or
@{await Html.RenderPartialAsync(…) }
使用 asp-validation-summary 的验证摘要
<div asp-validation-summary="ValidationSummary.All" class="text-danger"></div>
链接和脚本标签的惊人“回退机制”:<link> 和 <style> 标签现在将具有回退机制:是不是很棒?
对于<link> 使用属性:href, asp-fallback-href, asp-fallback-test-class, asp-fallback-test-property, asp-fallback-test-value
<environment names="Staging,Production">
<link rel="stylesheet" href="//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/css/bootstrap.min.css"
asp-fallback-test-class="hidden" asp-fallback-test-property="visibility" asp-fallback-test-value="hidden" />
<link rel="stylesheet" href="//ajax.aspnetcdn.com/ajax/bootstrap-touch-carousel/0.8.0/css/bootstrap-touch-carousel.css"
asp-fallback-href="~/lib/bootstrap-touch-carousel/css/bootstrap-touch-carousel.css"
asp-fallback-test-class="carousel-caption" asp-fallback-test-property="display" asp-fallback-test-value="none" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
对于<script> 使用属性:src, asp-fallback-src, asp-fallback-test
<environment names="Staging,Production">
<script src="//ajax.aspnetcdn.com/ajax/jquery/jquery-1.10.2.min.js"
asp-fallback-src="~/lib/jquery/jquery.min.js"
asp-fallback-test="window.jQuery">
</script>
<script src="//ajax.aspnetcdn.com/ajax/bootstrap/3.0.0/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/js/bootstrap.min.js"
asp-fallback-test="window.jQuery">
</script>
</environment>
摘要
纵观 .Net 团队对 Asp.Net 5 和 Visual Studio 所做的更改,它预示着 .Net 开发人员的光明未来。在 Visual Studio 中编写应用程序,并将其部署到任何平台。
希望大家都能从本文中学到一些新知识。
注意:到目前为止,这些是我在 Asp.Net 5 和 C# 6 中发现的更改。一旦发现新功能,我将更新本文。
源代码
附件是用 Visual Studio RC 2015 编写的源代码。