65.9K
CodeProject 正在变化。 阅读更多。
Home

隆重推出 ASP.NET Core:全新的 ASP.NET!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (25投票s)

2016 年 6 月 6 日

CPOL

12分钟阅读

viewsIcon

54673

本文重点介绍 ASP.NET Core 1.0 中的新功能和概念。

引言

本文重点介绍 ASP.NET Core 1.0 中的新功能和概念。

背景

新版 ASP.NET 称为 ASP.NET Core(又名 ASP.NET 5),它对 ASP.NET 进行了最重要的架构重新设计。本文将重点介绍新版 ASP.NET 中的新功能和概念。

什么是 ASP.NET Core?

ASP.NET Core 1.0 是一个全新的开源、跨平台框架,用于构建现代云原生 Web 应用程序。它从头开始构建,为部署在云端或本地服务器上的 Web 应用程序提供了一个优化的开发框架。此外,它还被重新设计,使 ASP.NET 更精简、模块化(因此您可以只添加应用程序所需的功能)、跨平台(因此您可以在 Windows、Mac 或 Linux 上轻松开发和运行应用程序,这非常棒)且云优化(因此您可以在云端部署和调试应用程序)。(在此处阅读更多内容:此处

旧版本

这对我们使用旧版 ASP.NET 的人意味着什么?

如果您使用的是旧版 ASP.NET,或者您来自 WebForms 开发背景,那么您可能会发现 ASP.NET Core 完全是新的。这就像从经典 ASP 迁移到 ASP.NET 世界的感觉,或者就像我写代码时我的狗看着我的屏幕显示器一样。

现在让我们开始吧!

以下是 ASP.NET Core 1.0 中核心的重大更改列表。

跨平台运行时

在 ASP.NET 的历史上,这是第一次您可以在 OSX 和 Linux 上运行 ASP.NET Core 应用程序。是的,ASP.NET Core 应用程序可以在 Windows、OSX 和 Linux 上运行。这一事实为全新的开发者和设计师群体打开了 ASP.NET 的大门。ASP.NET Core 在运行应用程序时提供两种运行时环境。这意味着您可以从两种运行时环境中进行选择,从而在部署应用程序时获得更大的灵活性,如下所示。

ASP.NET Core 1.0 是 ASP.NET 的重构版本,运行在 .NET Core 之上。它被重新设计为模块化的,允许开发人员插入项目仅需的组件,大多数功能将通过 NuGet 作为插件提供。模块化的一个好处是能够升级功能而不影响应用程序使用的其他功能。此外,.NET Core 是一个跨平台运行时,使您能够将应用程序部署到 OSX 或 Linux 操作系统。它也是一个云优化运行时,使您能够将应用程序部署到云端并进行调试。您可以在应用程序旁边一起部署 .NET Core,从而允许您在运行多个 .NET Core 版本的同一服务器上运行 ASP.NET Core 应用程序。

您也可以为仅 Windows 创建 ASP.NET Core 应用程序,该应用程序运行在 .NET 完整框架上。

ASP.NET 4.6 是 .NET 完整框架的最新版本,它使您能够利用所有可用的 .NET 组件并支持向后兼容。如果您计划将应用程序迁移到 .NET Core 上运行,那么您可能需要进行一些修改,因为 .NET Core 目前与完整的 .NET Framework 相比功能有限。

需要明确的是,ASP.NET 4.6 是一个更成熟的平台。它久经考验,已发布并可供使用。ASP.NET Core 1.0 是一个 1.0 版本,包含 Web API 和 MVC,但尚未包含 SignalR 或 Web Pages。它尚不支持 VB 或 F#。

ASP.NET Core 不仅仅是使用 Visual Studio

ASP.NET Core 不仅仅是使用 Visual Studio。使 ASP.NET Core 能够在 Windows、OSX 和 Linux 上运行改变了一切。这是开发人员和设计师首次能够在使用 ASP.NET 时,使用他们喜欢的开发环境(如 Sublime Text 和 WebStorm)通过 ASP.NET Core 开始构建应用程序。这太棒了!

新的项目解决方案结构

如果您在 Visual Studio 2015 中创建一个空的 ASP.NET Core 项目,您会看到这个(除非您之前没有创建过任何使用旧版 ASP.NET 的项目)

惊讶吗?是的,新的项目结构完全不同。项目模板是全新的,现在包括以下新文件:

  • global.json:在此处放置解决方案级别的设置,并允许您进行项目到项目的引用。
  • Program.cs:此文件包含 ASP.NET Core RC2 应用程序的 Main 方法,负责配置和运行应用程序。
  • src 文件夹:包含构成您应用程序的所有源代码项目。
  • wwwroot: 是一个文件夹,其中将放置所有静态文件。这些是您的 ASP.NET 应用程序将直接提供给客户端的资源,包括 HTML、CSS、图像和 JavaScript 文件。
  • project.json:包含项目设置。在 ASP.NET Core 中,您可以通过使用 NuGet 包管理器 (NPM) 或新的 project.json 文件添加 Nuget 包来管理依赖项。此文件使您能够轻松管理应用程序中的依赖项,因为您可以使用任何文本编辑器对其进行编辑。使用此文件会更容易,因为在 Visual Studio 2015 中,Intellisense 将帮助您查找可作为依赖项添加的可用 NuGet 包。下面是 project.json 的样子:

  • startup.cs – 这是您放置 ASP.NET Core 应用程序的启动和配置代码的地方。为了快速预览,以下是 startup 类可能的样子:

ConfigureServices 方法定义了您的应用程序使用的服务,Configure 方法用于定义构成您的请求管道的中间件。

  • References:它包含 .NETCoreApp Version 1 运行时引用。

WebForms

是的,WebForms 不是 ASP.NET 5 的一部分,这是一个令人 sad 的事实。您仍然可以通过将框架目标设置为 .NET 4.6 在 Visual Studio 2015 中继续构建 Web Forms 应用程序。但是,Web Forms 应用程序无法利用 ASP.NET 5 的新功能。

我花了多年时间构建从小型到大型企业级的 WebForms 应用程序。我喜欢 Web Forms,事实上,我仍然在各种论坛(如 http://forums.asp.net)上继续支持使用 WebForms 的社区。然而,是时候向前看了,学习新东西,最终是时候学习 ASP.NET MVC 了。就像过去许多事情一样,时代在变化,您要么适应,要么灭亡。

除了 WebForms 之外,.NET Core 通常不包括 Windows Forms、WCF、WPF、Silverlight 等。

VB.NET 和 F#

目前,在 ASP.NET Core 1.0 RC2 的当前版本中,不支持 VB.NET 和 F#。

ASP.NET Core:统一框架

新的 ASP.NET 将把 MVC、Web API 和可能还有 Web Pages 结合到一个名为 ASP.NET Core 的框架中。尽管在当前版本中,Web Pages 和 SignalR 尚未包含在内。

在以前版本的 ASP.NET MVC 中,MVC 控制器与 Web API 控制器不同。MVC 控制器使用 *System.Web.MVC.Controller* 基类,而 Web API 控制器使用 *System.Web.Http.ApiController* 基类。在 MVC Core 中,MVC 和 Web API 控制器只有一个 Controller 基类,即 *Microsoft.AspNetCore.Mvc.Controller* 类。

对于以前实现方式不同的 MVC 和 Web Pages 中的 HTML 帮助程序来说,这种合并很可能是真的。Web Pages 编程模型在当前版本中还不可用,所以我们无法真正确定他们将合并哪些其他功能,但我们可以假设传统的 MVC 模型绑定将可用于它。

视图组件

在以前版本的 ASP.NET MVC 中,通常使用 Html.Action() 辅助方法来调用子控制器。ASP.NET MVC Core 引入了新的视图组件来替换使用 Html.Action() 的小部件。

视图组件完全支持异步,允许您将视图组件设为异步。下面是一个返回基于某些状态的个人资料的视图组件示例:

 

using Microsoft.AspNetCore.Mvc;  
using MVC6Demo.Models;  
using System.Threading.Tasks;  
using System.Collections.Generic;  
  
namespace MVC6Demo.ViewComponents  
{  
    public class PersonListViewComponent : ViewComponent  
    {  
        public async Task

这是视图组件的视图:

<h3>Person List</h3>  
<ul>  
    @foreach (var p in Model) {  
        <li>@string.Format("{0} {1}",p.FirstName,p.LastName)</li>  
    }  
</ul> 

这是在主视图中调用视图组件的方法:

<div>   
    @await Component.InvokeAsync("PersonList", new { type = "Registered" })
</div>  

新指令:@inject、@using、@inherits

ASP.NET MVC Core 包含一些我们可以用于应用程序的新指令。在这里,我们将看看如何使用 @inject。@inject 指令允许您将来自某个类的某些方法调用直接注入到您的视图中。下面是一个公开了一些异步方法的简单类:

using System.Threading.Tasks;  
using System.Linq;  
  
namespace MVC6Demo.Models  
{  
    public class Stats  
    {  
        private PersonModel _persons = new PersonModel();  
  
        public async Task<int> GetPersonCount() {  
            return await Task.FromResult(_persons.GetAll.Count());  
        }  
  
        public async Task<int> GetRegisteredPersonCount() {  
            return await Task.FromResult(
                      _persons.GetAll.Where(o => o.Status.ToLower().Equals("registered")).Count());  
        }  
  
        public async Task<int> GetUnRegisteredPersonCount() {  
            return await Task.FromResult(
                     _persons.GetAll.Where(o => o.Status.ToLower().Equals("")).Count());  
        }  
    }  
} 

现在,我们可以使用 @inject 在视图中调用这些方法,例如:

@inject MVC6Demo.Models.Stats Stats  
  
@{  
    ViewBag.Title = "Stats";  
}  
  
<div>  
    <p>Registered: @await Stats.GetRegisteredPersonCount()</p>  
    <p>Un-registered: @await Stats.GetUnRegisteredPersonCount()</p>  
    <p>Total: @await Stats.GetPersonCount()</p>  
</div> 
 

这很酷!不是吗?:D

请查看我关于 ASP.NET MVC Core 的文章,其中详细介绍了新功能:ASP.NET MVC Core 入门

Tag Helpers

ASP.NET MVC Core 中的另一个很酷的功能是 Tag Helpers。Tag Helpers 是以前的 HTML Helpers 的可选替代品。

所以,与其这样做:

@using (Html.BeginForm("Login", "Account", FormMethod.Post, 
        new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
                <h4>Use a local account to log in.</h4>
                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group">
                    @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
                    </div>
                </div>
}

您还可以这样做:

<form asp-controller="Account" asp-action="Login" method="post" class="form-horizontal" role="form">  
    <h4>Use a local account to log in.</h4>  
    <hr />  
    <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>  
    <div class="form-group">  
        <label asp-for="UserName" class="col-md-2 control-label"></label>  
        <div class="col-md-10">  
            <input asp-for="UserName" class="col-md-2 control-label" />  
            <span asp-validation-for="UserName" class="text-danger"></span>  
        </div>  
    </div>  
</form> 

ASP.NET Core 不仅仅是 IIS

14 年前,ASP.NET 平台基本上只有一个 Web 服务器,那就是 IIS。几年后,Visual Studio Development Web Server(又名“Cassini”)出现了,它是一个仅用于开发的服务器。所有这些最终都使用 System.Web 作为应用程序和 Web 服务器之间的托管层。System.Web 主机与 IIS 紧密耦合,很难在其他主机上运行。

后来出现了 OWIN,作为应用程序和 Web 服务器之间的接口。Microsoft 编写了 Katana 作为一种 OWIN 实现,可以在多个服务器(包括 IIS 和 IIS Express、Katana 的自托管服务器和自定义主机)上托管 ASP.NET Web API、SignalR 和其他第三方框架。

ASP.NET Core 与 Katana 和 OWIN 一样是主机无关的,任何 ASP.NET Core 应用程序都可以托管在 IIS、IIS Express 或您自己的进程中自托管。此外,ASP.NET Core 将包含一个名为 Kestrel 的 Web 服务器(基于 libuv 构建),用于 iOS 和 Linux 等操作系统。

新的 HTTP 请求管道

ASP.NET Core 引入了一个新的、模块化的 HTTP 请求管道,因此您可以只添加您需要​​的组件。该管道也不再依赖于 System.Web。通过减少管道的开销,您的应用程序可以获得更好的性能和更优化的 HTTP 堆栈。新管道基于从 Katana 项目中学到的许多经验,并且还支持 OWIN。

动态 Web 开发

Visual Studio 2015 的另一个很酷的功能是动态编译能力。在以前版本的 ASP.NET 中,当我们更改应用程序中的代码时,每次想要看到更改都需要编译和构建应用程序。在新版本的 Visual Studio 中,不再需要执行这些额外的步骤,您只需要保存您正在修改的文件,然后刷新浏览器即可看到更改。

这是刷新浏览器后的输出:

Attribute Routing:[controller] 和 [action] 标记

在以前版本的 MVC 和 Web API 中,使用特性路由有时会带来一些麻烦,特别是当您进行代码重构时。这是因为路由总是必须指定为字符串,因此当您更改控制器名称时,您总是需要在路由属性中更改字符串。

MVC Core 引入了新的 [controller] 和 [action] 标记,可以解决此类问题。这是一篇精彩的文章,重点介绍了这些新标记的使用:ASP.NET MVC 6 Attribute Routing

内置依赖注入 (DI)

ASP.NET Core 内置了对依赖注入和服务定位器模式的支持。这意味着您不再需要依赖于第三方依赖注入框架,如 Ninject 或 AutoFac。

与 Grunt、Gulp 和 Bower 集成

Visual Studio 2015 内置了对这些流行的开源 Web 开发工具的支持。Grunt 和 Gulp 是任务运行器,可以帮助您自动化 Web 开发工作流。您可以使用它们来编译或压缩 JavaScript 文件。Bower 是一个客户端库包管理器,包括 CSS 和 JavaScript 库。

AngularJs 内置模板

AngularJs 是构建单页应用程序 (SPA) 最流行的客户端框架之一。Visual Studio 2015 包含用于创建 AngularJs 模块、控制器、指令和工厂的模板。

ASP.NET Core 对 GruntJS 的支持使 ASP.NET 成为构建客户端 AngularJs 应用程序的优秀服务器端框架。您可以在每次构建时自动合并和压缩所有 AngularJs 文件。请查看我关于在 ASP.NET Core 中入门 Angular 和 Angular2 的示例。

SignalR 3

ASP.NET Core 也将是 SignalR 3 的基础。这使您能够为云连接的应用程序添加实时功能。在此处查看我以前的 SignalR 示例:ASP.Net SignalR:构建一个简单的实时聊天应用程序

Web.Config

在 ASP.NET Core 中,混乱的 web.config 文件被名为“config.json”的新云就绪配置文件所取代。Microsoft 希望我们开发人员能够更轻松地将应用程序部署到云端,并让应用程序自动读取特定环境的正确配置值。下面是新配置文件外观的示例:

由于 ASP.NET Core 中的所有内容都是可插拔的,因此您需要在 Startup 类中配置配置源,例如:

        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath);

            builder.AddEnvironmentVariables();
            Configuration = builder.Build();
        }
        public IConfigurationRoot Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddTransient<MVC6Demo.Models.HeroStats>();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseDeveloperExceptionPage();


            app.UseMvc(m => {
                m.MapRoute(
                    name: "default",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action="Index"});
            });
        }

xUnit.Net:.NET 的新单元测试工具

在以前版本的 ASP.NET MVC 中,默认的测试框架是 Visual Studio Unit Testing Framework(有时称为 mstest)。该框架使用 [TestClass] 和 [TestMethod] 属性来描述单元测试。

ASP.NET Core 使用 xUnit.net 作为其单元测试框架。该框架使用 [Fact] 属性而不是 [TestMethod] 属性,并且无需 [TestClass] 属性。

完全免费且开源

是的,ASP.NET Core 是一个开源项目,托管在 GitHub 上。您可以查看代码,了解何时进行了更改,下载代码并提交更改。

我同意将 .NET 开源是明智之举。这符合商业利益,也符合社区利益。非常感谢 Microsoft。做得好!

我希望有人觉得这篇文章有用。:)

摘要

在本文中,我们了解了 ASP.NET Core 1.0 中一些很酷的新功能和概念。

© . All rights reserved.