ASP.NET Core web 应用程序 - 探索
前言
作为一个 Windows 系统下的开发者, 我对于 Core 的使用机会几乎为 0, 但是考虑到微软的战略规划, 我觉得, Core 还是有先了解起来的必要.
因为, 目前微软已经搞出了两个框架了, 一个是 Net 标准(.NetFramework), 一个是 Net Core.
而新特性的更新几乎都是在 Net Core 这个框架中.
所以, 考虑到未来, 一旦 Core 完善了, 那微软肯定会放弃现在的. NetFrameWork.
因此,.Net 程序员集体改用 Net Core, 想来, 一定是大趋势.
所以让我们怀着探索的精神来看看 ASP.NET Core Web 应用程序吧.
创建 ASP.NET Core 项目
首先, 我们先来创建一个 ASP.NET CoreWeb 应用程序项目, 然后一起探索.
打开 Visual Studio 创建项目, 选择 ASP.NET Core Web 应用程序, 如下图:
然后选择 ASP.NET CoreWeb 应用程如下图:
vcHL1eLR+dK7uPayvL7WtcTP7sS/o6zI58/CzbyjujwvcD4KPHA+PGltZyBzcmM9"https://www.2cto.com/uploadfile/Collfiles/20190422/20190422121912769.png" alt="\" />
可以看到, 项目中有四个文件和两个文件夹(Page,wwwroot).
其中 wwwroot 文件夹很特别, 图标和其他的文件夹不一样, 不过依然可以修改他的名称, 修改名称后, 文件夹图标会变回普通的图标, 不过既然是特殊图标, 想来一定有特殊意义, 我们稍后再研究, 先接着向下浏览 Page 文件夹.
Page 文件夹展开后, 发现里面有很多页面, 因此, 很明显, 它就是存储页面的地方了, 页面内容我们稍后再看, 现在, 我们先看看项目最外面的四个文件.
Program.cs
看到这个文件我也很奇怪, Web 是依赖 IIS 部署, AspNet 中是没有 Program 的, 那么 Core 中为什么多出了个 Program 文件呢? 我们调查一下.
原来 AspNetCore 有一个自带的服务器, 叫做 Kestrel .
什么是自带服务器呢? 就好比我们创建了一个 WCF 服务, 但又不想挂 IIS 上, 就自己建一个 ServiceHost 来挂服务.
但 Kestrel 明显更高级, 它还支持与反向代理服务器 (如 Internet Information Services (IIS),Nginx 或 Apache) 结合使用.
什么是[反向代理服务器] 呢? 就是由与 IIS 类似的服务器, 先接收来自网络的 HTTP 请求, 然后再将这些请求转发到 Kestrel, 最后由 Kestrel 来实现调用, 调用流程如下图所示.
调查到这里, 我做大致可以猜出了 Program.cs 是干什么的了 -- 它应该是用来启动 Kestrel 这个服务器的.
现在我打开 Program.cs, 发现如下代码.
- public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseStartup()
- .Build();
个人认为这段代码很坑, 这是一个函数的简写, 但又没起到简写的作用, 还容易扰乱初学者, 所以我们做一下修改, 如下:
- public static void Main(string[] args)
- {
- BuildWebHost(args).Run();
- }
- public static IWebHost BuildWebHost(string[] args)
- {
- return WebHost.CreateDefaultBuilder(args)
- .UseStartup()
- .Build();
- }
看修改后代码, 我们就很明确了, Main 函数启动, 调用 BuildWebHost 函数, 故名思意, 这是一个创建网站服务器的函数, 返回值是 IWebHost.
然后, 我们看到了, 在 Main 函数使用 BuildWebHost 函数返回的 IWebHost 的实例, 执行其下的 Run 方法.
到此, 已经很明确了, Program 就是启动服务器用的.
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.UseBrowserLink();
- App.UseDeveloperExceptionPage();
- }
- else
- {
- App.UseExceptionHandler("/Error");
- }
- App.UseStaticFiles();
- App.UseMvc();
- }
- }
我们看到了三个函数, 现在, 我们简单的为三个函数打一下断点, 启动一下网站.
很简单的得出, 三个函数的运行顺序是 Startup-->ConfigureServices-->Configure.
构造函数是简单的赋值, 我们跳过它, 来看 ConfigureServices.
可以看到 ConfigureServices 里只调用了 services.AddMvc(), 查看官方介绍, 原来这个方法是将 Mvc 服务添加到指定的服务集合中.
通过调试, 发现 ConfigureServices 函数的 services.AddMvc()与 Configure 函数 App.UseMvc()是成对的, 即当我们把 MVC 服务添加到服务集合中, 才能在后续的 Configure 方法里使用 Mvc 服务.
那么我们建立的是 Web 应用, 为什么要添加 Mvc 服务呢? 我们吧 Mvc 服务删除一下看看效果吧.
删除了 Mvc 服务后, 我们会发现, 网站启动起来了, 但是并没有正常访问我们的主页.
重新添加回 Mvc 服务, 我们再启动网站, 查看下网站链接路径如下:
- https://localhost:1234/Index
- https://localhost:1234/About
可以发现, 这些路径是 Mvc 模式的路径, 也就是说, ASP.NET Core Web 应用程序也是用 Mvc 路由访问网址, 所以, Mvc 的服务是必须添加的.
Configure 中, 我们看到还使用了其他 IApplicationBuilder 的方法, 不过这些方法我们即便注释掉, 也不影响网站启动, 所以我们暂时忽略他们, 等用到在学习吧.
bundleconfig.JSON
故名思意, 捆配置文件, 感觉和 mvc 的 BundleConfig.cs 文件很像, 打开看一下, 可以确定了, 就是 mvc 的捆配置文件. 那也就是说, 这个是没什么用的文件, 因为大多数情况, 我们不会进行捆配置.
appsettings.JSON
依然故名思意, 应该是应用设置文件, 这个名字很像, webconfig 里的 AppSetting 节点, 所以推断, 它应该是个配置项目固定值的文件.
百度一下 appsettings.JSON, 发现有很多都是如何读取该文件内容的文章, 那么, 现在可以确定了, 它就是个变量配置文件.
----------------------------------------------------------------------------------------------------
文件讲解完了, 下面我们来看文件夹里的内容.
wwwroot
上门介绍过了, wwwroot 是一个有特殊标记的文件夹.
打开 wwwroot, 我们会发现里面存储的是样式和图片. 运行网站, 在网站里查看下这些图片, 会发现图片地址都很奇怪.
图片路径是 / wwwroot/images/banner1.svg, 但访问起来, 却是 https://localhost:1234/images/banner1.svg.
也就是说, wwwroot 路径会被省略, 换一种说话, wwwroot 会被放到网站根目录下.
我们在做个实现, 新建个文件夹存储一些图片, 运行网站访问, 我们会发现, 根本无法访问这些图片.
那么, 我们可以得出结论了, wwwroot 是 ASP.NET Core Web 应用程序唯一可以访问的资源文件夹.
Pages
打开 Page 文件夹, 我们可以看到 4 个可以展开的 cshtml 和 4 个不能展开的 cshtml 文件.
打开我们最眼熟的_ViewStart.cshtml, 双击进入, 发现代码如下:
- @{
- Layout = "_Layout";
- }
可以看到, ViewStart 代码和 MVC 的 ViewStart 一样, 那也就是说, 这是个配置布局的文件了.
那么相对应的_Layout.cshtml 我们也可以确定了, 它就是个布局文件, 那么, 剩下两个 cshtml 文件, 我们也可以推断出了, 他们也是配置文件或者布局文件.
下面我们来看那 4 个可以展开的 cshtml 文件.
首先我们展开 Index.cshtml 文件, 如下图:
接着, 我们双击 Index.cshtml 文件, 发现里面就是普通的 HTML+razor 标记.
然后, 我们再双击 Index.cshtml.cs 文件查看内容, 得到代码如下:
- public class IndexModel : PageModel
- {
- public void OnGet()
- {
- }
- }
通过项目结构我们可以判断, Index.cshtml.cs 是 Index.cshtml 的一个后台文件.
但查看代码, 却发现里面的类是个继承 PageModel 类的 IndexModel, 那它到底和 Index.cshtml 文件有什么关系呢?
我们先通过命名推测, IndexModel 中包含 Model 关键字, 所以他应该是与 Index.cshtml 文件有关的 Model.
与 Index.cshtml 文件有关的 Model? 那不就是 ViewModel 了吗!!!
现在我们再回头仔细的看下 Index.cshtml 文件寻找线索.
我发现, 该文件的前两行内容如下:
- @page
- @model IndexModel
这是 Mvc 传递页面实体的写法, 即 IndexModel 确实是 Index.cshtml 的实体.
那么, 我们上面的推测就被证实了, Index.cshtml.cs 文件就是 Index.cshtml 文件的 ViewModel.
但 Onget 是什么呢?
我们依然通过命名推测, 我推测它就是以前 AspNet 的 PageLoad(页面导入时触发的函数)?
下面我们测试一下, 修改代码如下:
public string title;
然后断点 Onget 方法.
接着我们访问 https://localhost:1234/index?title=kiba 网址.
结果, 我们的断点被命中了, 标题也顺利设置成功. 因此, 我们的推测又成功了, OnGet 就是我们之前的 PageLoad 方法.
结语
综上所述, 我们对 ASP.NET Core Web 应用程序已经有了一定的了解, 然后我得出了这样一个结论:
[ASP.NET Core Web 应用程序]在设计上, 采用的了 MVVM 的设计理念 (cshtml.cs 文件就是我们[服务端] 页面的 ViewModel 了), 请求网址使用了 Mvc 的路径访问技术, 整体上是一个更优秀的 AspNet 框架.
PS: 喜欢 MVVM 的朋友有福音了:).
----------------------------------------------------------------------------------------------------
到此 ASP.NET Core Web 应用程序探索就结束了.
代码已经传到 GitHub 上了, 欢迎大家下载.
GitHub 地址: https://github.com/kiba518/KibaAspNetCore
----------------------------------------------------------------------------------------------------
来源: https://www.2cto.com/kf/201904/805018.html