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应用程序,如下图:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

可以看到,项目中有四个文件和两个文件夹(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来实现调用,调用流程如下图所示。

640?wx_fmt=png

调查到这里,我做大致可以猜出了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/Index

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,双击进入,发现代码如下:

可以看到,ViewStart代码和MVC的ViewStart一样,那也就是说,这是个配置布局的文件了。

那么相对应的_Layout.cshtml我们也可以确定了,它就是个布局文件,那么,剩下两个cshtml文件,我们也可以推断出了,他们也是配置文件或者布局文件。

下面我们来看那4个可以展开的cshtml文件。

首先我们展开Index.cshtml文件,如下图:

640?wx_fmt=png

接着,我们双击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文件寻找线索。

我发现,该文件的前两行内容如下:

这是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框架。

PS:喜欢MVVM的朋友有福音了:)。

----------------------------------------------------------------------------------------------------

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

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

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

原文地址:https://www.cnblogs.com/kiba/p/10722574.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于跳蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.跳蛛算法4.实验参数设定5.算法结果6.参考文献7.MA…

让你的ASP.NET Core应用程序更安全

对于ASP.NET Core应用程序&#xff0c;除了提供认证和授权机制来保证服务的安全性&#xff0c;还需要考虑下面的一些安全因素&#xff1a;CSRF强制HTTPS安全的HTTP HeadersCSRFASP.NET Core通过AntiForgeryToken来阻止CSRF攻击&#xff0c;一般来说&#xff0c;当用户做表单提交…

.net core 中间件管道底层剖析

.net core 管道&#xff08;Pipeline&#xff09;是什么&#xff1f;由上图可以看出&#xff0c;.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程&#xff0c;如果我们简化一下成下图来看的话&#xff0c;.net core 的管道其实就是中间件的部分。微软中…

架构为什么要以领域为核心

很久以前, 人们以为地球是太阳系的中心.然后一位聪明人, 哥白尼, 他改变了我们对太阳系的看法. 他认为太阳是太阳系的中心:这是对太阳更好的一个解释, 更简单也更具说服力. 事实上, 以太阳为中心的模型确实是更优雅的.上面这件事也发生在软件开发里. 下面这个就是很多开发者惯用…

201403-5 任务调度

哇&#xff0c;ccf csp认证考试 历年真题解&#xff08;一本书&#xff09;真厉害。 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>using namespace std;typedef long long LL; typedef pair<int,int> PII; con…

C# - 为引用类型重定义相等性 - 继承相关

派生类这是上面Citizen类的一个子类&#xff1a;下面我重写object.Equals() 方法&#xff1a;大部分逻辑都在base.Equals()方法里了&#xff0c;首先如果父类的Equals()方法返回false&#xff0c;那么下面也就不用做啥了。但是如果父类Equals()认为这两个实例是相等的&#xff…

微软百名员工签名力挺996.ICU

中国程序员上传到 GitHub 的 996.ICU repo 火速在互联网广泛传播时&#xff0c;996 工作制引起了全球的广泛关注&#xff0c;Python 之父直指这是不人道的行为&#xff0c;事情经过不断发酵&#xff0c;中国官方媒体也接连发声表态要警惕「996 工作制」。就在今日&#xff0c;微…

P1174 打砖块

P1174 打砖块 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; I_AM_HelloWord danxmz2006 这两个博客结合看&#xff0c;大致就能理解 我们只在N处转移&#xff0c;面对Y类的块无需决策&#xff0c;因为Y类的块可以一直打 不同的打砖块的顺序&#xff0c;决定了我…

包治百病 | 如何将一个.NET Core类库发布到NuGet

点击上方蓝字关注“汪宇杰博客”NuGet是.NET世界的包管理器&#xff0c;有官方的nuget.org&#xff0c;也允许构建公司和私人的服务器。在.NET Core的时代&#xff0c;封装一个NuGet包比以往更容易&#xff0c;我们来看看吧&#xff01;NuGet账号如果你想和微软一起予力众生&am…

如何在ASP.NET Core中使用Azure Service Bus Queue

原文&#xff1a;USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES作者&#xff1a;damienbod[1] 译文&#xff1a;如何在ASP.NET Core中使用Azure Service Bus Queue地址&#xff1a;https://www.cnblogs.com/lwqlun/p/10760227.html作者&#xff1a;Lamond Lu源代…

从B站的代码泄露事件中,我们能学到些什么?

先声明一下&#xff0c;本文不聊ISSUE中的七七八八&#xff0c;也不聊代码是否写的好&#xff0c;更不聊是不是跟蔡徐坤有关之类的吃瓜内容。仅站在技术人的角度&#xff0c;从这次的代码泄露事件&#xff0c;聊聊在代码的安全管理上&#xff0c;通常都需要做哪些事来预防此类事…

[Abp vNext 源码分析] - 3. 依赖注入与拦截器

一、简要说明ABP vNext 框架在使用依赖注入服务的时候&#xff0c;是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包。这里与原来的 ABP 框架就不一样了&#xff0c;原来的 ABP 框架还需要抽象出来一个 IIocManager 用来管理整个 IoC 容器&#xff0c;现在…

dotnet core 微服务教程

这个教程主要是对于第一次使用dotnet core开发的同学。运行环境是在centos 7 &#xff0c;使用了docker容器。即这是一篇运行在linux的docker容器上的微服务的简单应用。一. 安装.NET SDK安装.NET之前&#xff0c;先安装一些依赖&#xff0c;运行下面的命令sudo rpm -Uvh https…

eShopOnContainers 是一个基于微服务的.NET Core示例框架

找到一个好的示例框架很难&#xff0c;但不是不可能。大多数是小型Todo风格的应用程序&#xff0c;通常基于SimpleCRUD。值得庆幸的是&#xff0c;Microsoft已经为eShopOnContainers创建了一个基于微服务的.NET Core示例应用程序。eShopOnContainers是 .NET Core示例应用框架&a…

「拥抱开源, 又见 .NET」系列第三次线下活动简报

「拥抱开源, 又见 .NET」随着 .NET Core的发布和开源&#xff0c;.NET又重新回到人们的视野。自2016年 .NET Core 1.0 发布以来&#xff0c;其强大的生命力让越来越多技术爱好者对她的未来满怀憧憬&#xff0c;越来越多的平台、框架热衷于为.NET Core不断更新的版本提供最有力的…

P3302 SDOI2013森林

P3302 [SDOI2013]森林 题意&#xff1a; 一片森林&#xff0c;有n个节点&#xff0c;m个边&#xff0c;现在有t个操作&#xff0c; Q x y k&#xff1a;Q x y k 查询点 x 到点 y 路径上所有的权值中&#xff0c;第 k 小的权值是多少 L x y 在点 x 和点 y 之间连接一条边。保证…

请给你的短信验证码接口加上SSL双向验证

序言去年年底闲来几天&#xff0c;有位同事专门在网上找一些注册型的app和网站&#xff0c;研究其短信接口是否安全&#xff0c;半天下来找到30来家&#xff0c;一些短信接口由于分析难度原因&#xff0c;没有继续深入&#xff0c;但差不多挖掘到20来个&#xff0c;可以肆意被调…

在Asp.Net Core中集成Kafka

在我们的业务中&#xff0c;我们通常需要在自己的业务子系统之间相互发送消息&#xff0c;一端去发送消息另一端去消费当前消息&#xff0c;这就涉及到使用消息队列MQ的一些内容&#xff0c;消息队列成熟的框架有多种&#xff0c;这里你可以读这篇文章来了解这些MQ的不同&#…

分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark

今天早上六点半左右微信群里就看到张队发的关于.NET Spark大数据的链接https://devblogs.microsoft.com/dotnet/introducing-net-for-apache-spark/ &#xff0c;正印证了“微软在不断通过.NET Core补齐各领域开发&#xff0c;真正实现一种语言的跨平台”这句话。那么我们今天就…

acwing3132. 食物(BZOJ3028)

acwing3132. 食物 题意&#xff1a; 你当然要帮他计算携带 N 件物品的方案数。 承德汉堡&#xff1a;偶数个。 可乐&#xff1a;0 个或 1 个。 鸡腿&#xff1a;0 个&#xff0c;1 个或 2 个。 蜜桃多&#xff1a;奇数个。 鸡块&#xff1a;4 的倍数个。 包子&#xff1a;0 个…