广州.NET培训
达内广州.NET培训中心

18589266248

热门课程

广州达内:Amazing ASP.NET Core 2.0

  • 时间:2017-06-17 14:22
  • 发布:达内
  • 来源:广州达内

广州达内】ASP.NET Core的变化和发展速度是飞快的,当你发现你还没有掌握ASP.NET Core 1.0的时候,2.0已经快要发布了,目前2.0处于Preview 1版本,意味着功能已经基本确定,还没有学习过ASP.NET Core的同学可以直接从2.0开始学起,但是如果你已经掌握了1.0的话,那么你只需要了解在2.0中增加和修改的一些功能即可。

每一次大版本的发布和升级,总会带给开发人员一些惊喜和令人兴奋的特性,有关ASP.NET Core本次的2.0版本的新特性,主要集中在几个部分上。

SDK的变化

PS:目前如果你想在VS中体验ASP.NET Core 2.0全部特性的话,你需要VS 2017.3预览版本。当然你可以使用VS Core来快速了解。

.NET Core 2.0 Priview的下载地址:

https://www.microsoft.com/net/core/preview#windowscmd

完成之后可以在cmd中使用以下命令查看版本。

变化1:添加了如下图箭头所指新命令。

dotnet new razor

dotnet new nugetconfig

dotnet new page

dotnet new viewimports

dotnet new viewstart

添加了这些新的cli命令。 其中viewimports,viewstart即为Razor视图中的_xxx.cshtml那两个文件.

变化2:dotnet new xxx将会自动还原NuGet包,不需要你再次进行dotnet restore命令了。

G:\Sample\ASPNETCore2 > dotnet new mvc

The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.

This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.

Processing post-creation actions...

Running 'dotnet restore' on G:\Sample\ASPNETCore2\ASPNETCore2.csproj...

Restore succeeded.

*.csproj项目文件

在2.0中,当创建一个MVC项目的时候,生成的csporj项目文件如下:

其中,红色箭头部分为新增内容,我们依次来看一下:

MvcRazorCompileOnPublish:

在1.0版本中,如果我们需要在发布的时候编译MVC中的Views文件夹为DLL的话,需要引用

Microsoft.AspNetCore.Mvc.Razor.ViewCompilation这个NuGet包,而现在已经不需要了,这个功能已经默认的集成在了SDK中,只需要在csporj添加配置即可,在发布的时候将会自动打包Views文件夹中的*.cshtml文件为DLL程序集。

PackageTargetFallback

这个配置项是用来配置当前程序集支持的目标框架。

UserSecretsId

这个是用来存储程序中使用的机密,以前是存储在project.json文件中,现在你可以在这里进行配置了。

有关UserSecrets的更多信息,可以查看我的这篇博客文章。

MVC相关包

在Core MVC 2.0中,所有MVC相关的NuGet包都被集成到了这个Microsoft.AspNetCore.All包中,它是一个元数据包,包含了大量的东西,其中包括:Authorization, Authentication, Identity, CORS, Localization, Logging, Razor, Kestrel等,除了这些它还附加了EntityFramework, SqlServer, Sqlite等包。

有些同学可能会觉得这样会引用了很多项目中使用不到的程序集,导致发布后的程序变得很庞大,不过我要告诉你不必担心,发布后的程序集不但不会变得很大,反而会小很多,因为Microsoft把所有的这些依赖全部都集成到了sdk中,也就是说当你安装sdk的之后,MVC相关的包就已经安装到了你的系统上。

这样的好处是你不用担心更新Nuget包或者删除的时候,因为大量的版本不一致问题导致隐藏的冲突问题,另外一个好处就是,这样对于很多新手的话就很友好2333,他们不需要知道他们什么情况下会从那个NuGet包中获取自己需要的信息。

现在,发布后的文件夹是如此简洁: 大小4.3M

再贴个以前的 发布后的文件夹你们感受一下:大小16.5M

有些同学可能好奇他们把那些引用的MVC包放到哪里了,默认情况下他们位于这个目录:

C:\Program Files\dotnet\store\x64\netcoreapp2.0

新的Program.cs和Startup.cs

现在,当创建一个ASP.NET Core 2.0 MVC程序的时候,Program和Startup已经发生了变化,他们已经变成了这样:

Program.cs

public class Program

{

public static void Main(string[] args)

{

BuildWebHost(args).Run();

}

public static IWebHost BuildWebHost(string[] args) =>

WebHost.CreateDefaultBuilder(args)

.UseStartup()

.Build();

}

Startup.cs

public class Startup

{

public Startup(IConfiguration configuration)

{

Configuration = configuration;

}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)

{

services.AddMvc();

}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

{

if (env.IsDevelopment())

{

app.UseDeveloperExceptionPage();

}

else

{

app.UseExceptionHandler("/Home/Error");

}

app.UseStaticFiles();

app.UseMvc(routes =>

{

routes.MapRoute(

name: "default",

template: "{controller=Home}/{action=Index}/{id?}");

});

}

}

可以发现,新的Program.cs中和Startup.cs中的内容已经变得很简单了,少了很多比如appsetting.json文件的添加,日志中间件,Kertrel,HostingEnvironment等,那么是怎么回事呢?其他他们已经被集成到了WebHost.CreateDefaultBuilder这个函数中,那么我们跟进源码来看一下内部是怎么做的。

WebHost.CreateDefaultBuilder

下面是WebHost.CreateDefaultBuilder这个函数的源码:

public static IWebHostBuilder CreateDefaultBuilder(string[] args)

{

var builder = new WebHostBuilder()

.UseKestrel()

.UseContentRoot(Directory.GetCurrentDirectory())

.ConfigureAppConfiguration((hostingContext, config) =>

{

var env = hostingContext.HostingEnvironment;

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

if (env.IsDevelopment())

{

var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));

if (appAssembly != null)

{

config.AddUserSecrets(appAssembly, optional: true);

}

}

config.AddEnvironmentVariables();

if (args != null)

{

config.AddCommandLine(args);

}

})

.ConfigureLogging((hostingContext, logging) =>

{

logging.UseConfiguration(hostingContext.Configuration.GetSection("Logging"));

logging.AddConsole();

logging.AddDebug();

})

.UseIISIntegration()

.UseDefaultServiceProvider((context, options) =>

{

options.ValidateScopes = context.HostingEnvironment.IsDevelopment();

})

.ConfigureServices(services =>

{

services.AddTransient, KestrelServerOptionsSetup>();

});

return builder;

}

可看到,新的方式已经隐藏了很多细节,帮助我们完成了大部分的配置工作。但是你知道怎么样来自定义这些中间件或者配置也是必要的技能之一。

appsettings.json的变化

在appsettings.json中,我们可以定义Kestrel相关的配置,应用程序会在启动的时候使用该配置进行Kerstrel的启动。

{

"Kestrel": {

"Endpoints": {

"Localhost": {

"Address": "127.0.0.1",

"Port": "9000"

},

"LocalhostHttps": {

"Address": "127.0.0.1",

"Port": "9001",

"Certificate": "Https"

}

}

},

"Certificate": {

"HTTPS": {

"Source": "Store",

"StoreLocation": "LocalMachine",

"StoreName": "MyName",

"Subject": "CN=localhost",

"AllowInvalid": true

}

},

"Logging": {

"IncludeScopes": false,

"LogLevel": {

"Default": "Warning"

}

}

}

以上配置内容配置了Kertrel启动的时候使用的本地地址和端口,以及在生产环境需要使用的HTTPS的配置项,通常情况下关于HTTPS的节点配置部分应该位于appsettings.Production.json文件中。

现在,dotnet run在启动的时候将同时监听9000,和9001端口。

日志的变化

在ASP.NET Core 2.0中关于日志的变化是非常令人欣慰的,因为它现在不是作为MVC中间件配置的一部分了,而是Host的一部分,这句话好像有点别扭,囧~。 这意味着你可以记录到更加底层产生的一些错误信息了。

现在你可以这样来扩展日志配置。

public static IWebHost BuildWebHost(string[] args) =>

WebHost.CreateDefaultBuilder(args)

.UseStartup()

.ConfigureLogging(factory=>{你的配置})

.Build();

全新的Razor Pages

ASP.NET Core 2.0引入的另外一个令人兴奋的特性就是Razor Pages。提供了另外一种方式可以让你在做Web页面开发的时候更加的沉浸式编程,或者叫page-focused。额...它有点像以前Web Form Page,它隶属于MVC框架的一部分,但是他们没有Controller。

你可以通过dotnet new razor命令来新建一个Razor Pages类型的应用程序。

Razor Pages的cshtml页面代码可能看起来是这样的:

@page

@{

var message = "Hello, World!";

}

@message

Razor Pages的页面必须具有@page标记。他们可能还会有一个*.cshtml.cs的class文件,对应的页面相关的一些代码,是不是很像Web Form呢?

有同学可能会问了,没有Controller是怎么路由的呢?实际上,他们是通过文件夹物理路径的方式进行导航,比如:

文件名和路径

匹配的URL

/Pages/Index.cshtml

/ or /Index

/Pages/Contact.cshtml

/Contact

/Pages/Store/Contact.cshtml

/Store/Contact

有关Razor Pages的更多信息可以看这里:

https://docs.microsoft.com/en-us/aspnet/core/razor-pages

总结

可以看到,在ASP.NET Core 2.0中,给我们的开发过程带来了很多便利和帮助,他们包括Program等的改进,包括MVC相关NuGet包的集成,包括appsetting.json的服务器配置,以及令人惊讶的Razor Page,是不是已经迫不及待的期待正式版的发布呢?

上一篇:广州.Net培训教你LINQ延迟如何查询?
下一篇:广州达内:.NET 3.x新特性之Lambda表达式

广州.Net培训:.Net培训有什么特色?

广州.Net培训:学习.Net的几个基本步骤

达内海归硕士高薪入职软通动力外派华为

女生适合做程序员吗?美女程序员用技术征服IT名企

选择城市和中心
贵州省

广西省

海南省