当前位置: 移动技术网 > IT编程>开发语言>.net > Asp.Net Core Web应用程序—探索

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

2019年04月23日  | 移动技术网IT编程  | 我要评论

天龙明王传,www.lsbbs.org,女拳霸3

前言

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

@{
    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; 
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

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

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下方的推荐】,非常感谢!

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网