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 Core Web应用程序项目,然后一起探索。

打开Visual Studio创建项目,选择Asp.Net Core Web应用程序,如下图:

然后选择Asp.Net Core Web应用程如下图:

然后我们得到了这样一个布局的项目,如下图:

可以看到,项目中有四个文件和两个文件夹(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<Startup>()
    .Build();

个人认为这段代码很坑,这是一个函数的简写,但又没起到简写的作用,还容易扰乱初学者,所以我们做一下修改,如下:

public static void Main(string[] args)
{
 BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
 return WebHost.CreateDefaultBuilder(args)
  .UseStartup<Startup>()
  .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服务,我们再启动网站,查看下网站链接路径如下:

http://localhost:1234/Indexp>

http://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,但访问起来,却是http://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; <br>public void OnGet()
{
 title = this.Request.Query["title"];
 if (!string.IsNullOrWhiteSpace(title))
 {
  ViewData["Title"] = title;
 }
}

然后断点Onget方法。

接着我们访问http://localhost:1234/index?title=kiba网址。

结果,我们的断点被命中了,标题也顺利设置成功。因此,我们的推测又成功了,OnGet就是我们之前的PageLoad方法。

结语
综上所述,我们对Asp.Net Core Web应用程序已经有了一定的了解,然后我得出了这样一个结论:

[Asp.Net Core Web应用程序]在设计上,采用的了MVVM的设计理念(cshtml.cs文件就是我们[服务端]页面的ViewModel了),请求网址使用了Mvc的路径访问技术,整体上是一个更优秀的AspNet框架。

到此Asp.Net Core Web应用程序探索就结束了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/KibaAspNetCore

以上所述是小编给大家介绍的Asp.Net Core Web应用程序—探索详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • ASP.NET Core实现单体程序的事件发布/订阅详解

    背景 事件发布/订阅是一种非常强大的模式,它可以帮助业务组件间实现完全解耦,不同的业务组件只依赖事件,只关注哪些事件是需要自己处理的,而不用关注谁来处理自己发布事件,事件追溯(Event Sourcing)也是基于事件发布/订阅的.在微服务架构中,事件发布/订阅有非常多的应用场景.今天我给大家分享一个基于ASP.NET Core的单体程序使用事件发布/订阅的例子,针对分布式项目的事件发布/订阅比较复杂,难点是事务处理,后续我会另写一篇博文来演示. 案例说明 当前我们有一个基于ASP.NET Co

  • ASP.NET Core程序发布到Linux生产环境详解

    在这篇文章里我们将介绍如何在 Ubuntu 14.04 Server上部署ASP.NET Core应用程序.我们将把ASP.NET Core应用程序放到一个反向代理服务器的后面,由代理服务器把请求转交给我们的Kestrel服务器.除此之外,我们还将保证我们的web应用程序作为一个守护进程来进行启动.我们需要配置一个进程管理工具来帮助我们在程序崩溃时恢复程序,以保证高可用性. 章节: 准备 复制你的应用程序 配置一个反向代理服务器 监控我们的应用程序 启动我们的应用程序 观察日志 使我们的应用程序

  • 如何在ASP.NET Core应用程序运行Vue并且部署在IIS上详解

    前言 从.NET Core 1.0开始我们就将其应用到项目中,但是呢我对ASP.NET Core一些原理也还未开始研究,仅限于会用,不过园子中已有大量文章存在,借着有点空余时间,我们来讲讲如何利用ASP.NET Core结合Vue在IIS上运行. ASP.NET Core结合Vue部署于IIS 关于安装Vue和Webpack则不再叙述,我们直接来创建ASP.NET Core应用程序或者通过dotnet new mvc创建ASP.NET Core应用程序 接下来在上述应用程序下通过如下命令创建Vu

  • 详解将ASP.NET Core应用程序部署至生产环境中(CentOS7)

    将ASP.NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署

  • Asp.Net Core Web应用程序—探索

    前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准(.NetFramework),一个是Net Core. 而新特性的更新几乎都是在Net Core这个框架中. 所以,考虑到未来,一旦Core完善了,那微软肯定会放弃现在的.NetFrameWork. 因此,.Net程序员集体改用Net Core,想来,一定是大趋势. 所以让我们怀着探索的精神来看看A

  • 创建ASP.NET Core Web应用程序并介绍项目模板

    目录 创建ASP.NET Web 应用程序 运行ASP.NET Core Web 应用程序: ASP.NET Core应用程序模板 空 API Web应用程序模板 Web应用程序(模型视图-控制器)模板 Angular, React.js, React.js, and Redux: 创建ASP.NET Web 应用程序 打开安装后的VisualStudio 2019,点击"创建新项目", 如下所示. 单击"创建新项目"框后,它将打开"创建新项目"

  • 详解在Azure上部署Asp.NET Core Web App

    在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App.通过阅读本文,您将能了解到如何创建 Asp.NET Core 应用程序和如何在Azure上创建 Web App 并部署

  • 在IIS上部署ASP.NET Core Web API的方法步骤

    对于本文,我想与您分享有关如何在IIS上部署ASP.NET Core Web API的指南.我将指导您安装Visual Studio 2019,.NET Core Runtime 3.0.我还确保我逐步引导您在服务器(Web IIS)中启用它,使用no受管代码选项创建新的应用程序池,创建ASP.NET Core Web API项目以及发布ASP.NET Core Web API. 了解并遵循正确的步骤来准备开发和部署环境后,在IIS上部署ASP.NET Core Web API就是一件容易的事.

  • ASP.NET Core Web API 教程Project Configuration

    目录 1. 创建新项目 2. launchSettings.json 文件 3. Program.cs 和 Startup.cs 4. 扩展方法和 CORS 配置 5. IIS 配置 6. Startup 类中的其它代码 7. 基于环境的设置 前言: 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,对原文进行了翻译,同时适当删减.修改了一部分内容. 对于某些概念和原理,原书和本文中都没有进行详细描述,如果一一详细介绍,内容就显得臃肿且混乱,我个人是先

  • ASP.NET Core Web资源打包与压缩技术介绍

    概述 在ASP.Net中可以使用打包与压缩这两种技术来提高Web应用程序页面加载的性能.通过减少从服务器请求的次数和减少资源文件的体积来提高加载性能. 打包是一地将多个文件(CSS,JavaScript等资源文件)合并或打包到单个文件.文件合并可减少了 Web 资源文件从服务器的所需请求数,这样也可提高页面载入的性能. 压缩是将各种不同的代码进行优化,以减少请求资源文件的体积.压缩的常见方法删除不必要的空格和注释,并将变量名缩减为一个字符. 例如下面JavaScript函数: AddAltToI

  • 如何给ASP.NET Core Web发布包做减法详解

    1.引言 紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板.这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题. 在ASP.NET Core Web App中我们可以通过Bower或NPM来安装一些JS.CSS插件,来方便我们组织前端组件.但是这也给我带来了一个问题,那就是发布时需要把安装的Bower包或NPM包都要打包上传到服务器. 如果现在发布ASP.NET Core Web App,wwwroot下已包含到项目中的文件都会被发布.虽然

  • ASP.NET Core Web App应用第三方Bootstrap模板的方法教程

    引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例,来应用第三方Bootstrap Template--Admin LTE. AdminLte Dashboard 1. 创建ASP.NET Core MVC Demo 命令行执行dotnet new mvc -n ApplyBootstrapTemplate,即可创建预置的MVC模板项目.项目结构如下

  • 详解如何在ASP.NET Core Web API中以三种方式返回数据

    在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示: [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { [HttpGet] public IEnumerable<WeatherForecast> Get() { var rng = new Random()

随机推荐