《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1
创建好项目后,解决方案资源管理器窗口里我们看到,增加了不少文件夹及文件,如下图所示:

在解决方案文件夹中,找到项目文件夹,该文件夹又包含五个子文件夹 -Models、Controllers、Views、Properties、及wwwroot;Models、Controllers、Views对应MVC模型,控制器和视图。 Properties文件夹包含一个文件(launchSettings.json),它控制Visual Studio如何运行和调试应用程序。 wwwroot文件夹很特别,因为它是应用程序中浏览器可以直接访问的唯一的文件夹,你可以在这里面存放应用需要用到的CSS,JavaScript,图片或静态HTML文件。 浏览器无法访问wwwroot之外的文件。虽然磁盘上存在wwwroot和Properties文件夹,但您可以看到解决方案资源管理器将它们显示为特殊节点,不按字母顺序排列,位于项目的顶部区域。 在项目中还有两个特殊的节点,Dependencies和Connected Services,它们在磁盘上没有相应的文件夹。 它们显示项目所有依赖项的集合,例如NuGet包、客户端依赖项和项目所依赖的远程服务。在目根目录中,还有几个JSON文件-appsettings.json、bundleconfig.json和bower.json。 它们提供了各种配置设置,其中一些在运行时使用,另一些在编译时用于构建应用程序。(Bower是一个客户端资产管理系统,用于获取CSS和JavaScript库。 由于Bower被放弃维护,ASP.NET团队正在探索替代方案。 bower.json文件很可能会在后面的版本中从默认模板中删除并替换)。项目中最重要的文件是WebApplication2.csproj,因为它描述了如何构建你的项目。 Visual Studio未在解决方案中显式列出csproj文件,但可以在项目名称右键并选择“编辑”菜单对其进行编辑。Visual Studio还在项目文件夹中列出了两个C#文件-Program.cs和Startup.cs。 在后面的章节,将介绍这两个类是如何实现配置和运行您的应用程序的。
csproj项目文件:定义依赖项
csproj文件是.NET应用程序的项目文件,包含.NET工具构建项目所需的详细信息。 它定义了正项目的类型(Web应用程序、控制台应用程序、类库),项目的目标平台(.NET Core、.NET Framework 4.5、Mono等),以及项目所依赖的NuGet包。项目文件一直是.NET应用程序的核心,ASP.NET Core对其进行了调整,使其更易于阅读和编辑。 这些调整如下:
1、没有GUID - 以前,全局唯一标识符(GUID)大量用于项目文件中;
2、隐式文件包括 (Implicit file includes—)- 以前,项目中的每个文件都必须列在csproj文件中,项目才能编译; 现在,文件会被自动编译;
3、没有NuGet包dll的路径 - 以前,csproj必须包含dll的路径,以及在packages.xml文件中列出依赖项。 现在,您可以直接在csproj中引用NuGet包,不需要指定磁盘上路径;
这些变化使项目文件更加简洁,下图显示了整个csproj文件:

上图中Project元素的Sdk属性设定编译项目的默认设置,TargetFramework元素设定应用程序的运行框架,对于.NET Core 2.0项目,值为netcoreapp2.0; 对于完整的.NET Framework 4.6.1项目,值为net461。对于简单的应用程序,我们不需要更改项目文件,如果你想编辑csproj文件,不用像之前的版本那样先关闭项目,直接用前面提到的方法编辑即可。对项目文件最常见的更改是添加项目引用(PackageReference元素下NuGet包),.NET Core项目默认情况下,只引用一个NuGet包-Microsoft.AspNetCore.All,它是一个元数据包(元数据包是一个不包含代码的NuGet包,它引用一个或多个其他NuGet包,通过将元数据包添加到应用程序,可以方便地和隐式地添加它的所有包引用),包含了ASP.NET Core 2.0相关的所有软件包,但这不意味着,应用将使用所有的ASP.NET Core包。在ASP.NET Core 2.1中,Microsoft.AspNetCore.App元数据包引用默认已经安装上。 您可以在https://github.com/aspnet/Announcements/issues/287 查看Microsoft.AspNetCore.App和所有元数据包的区别。
简化后的项目文件更易手工编辑,这有利于开发跨平台应用。如果仍然使用Visual Studio,你依然可以像以前一样添加项目引用,管理NuGet包等。有关csproj格式更改的更多详细信息,可参阅https://docs.microsoft.com/en-us/dotnet/core/tools/csproj。
Program类:构建Web主机
所有ASP.NET Core应用程序的启动方式与.NET控制台应用程序相同 - 使用Program.cs文件。 此文件包含静态 Main函数(这是控制台应用程序的标准特性)。 应用中必须包含这个方法,它在启动Web应用程序时调用。 在ASP.NET Core应用程序中,它用于构建和运行一个IWebHost实例,如下图所示,它显示了默认的Program.cs文件。 IWebHost是ASP.NET Core应用程序的核心,包含应用程序配置和侦听请求的Kestrel服务器,并返回客户端请求回应。

Main函数包含创建Web服务器并开始侦听请求所需的基本初始化代码,在实例化IWebHost之前,通过CreateDefaultBuilder方法定义IWebHost的配置。应用程序的大部分配置都发生在CreateDefaultBuilder方法中,它还将一些职责委托给一个单独的类Startup。 这个类通过泛型方法UseStartup<> 引用,在这里可以配置应用程序的服务和中间件间。
这里有不少人提出这样的疑问,为什么要把配置分拆到两个类中?一般来说,Program类负责应用的基础结构,例如:Http服务器、与IIS集成、配置源;Startup定义应用将使用哪些功能、组件以及中间件。如下图所示:

两个不同的ASP.NET Core 应用程序的Program类通常是相似的,但Startup类通常会有很大不同(尽管它们通常遵循类似的模式)。 随着应用程序的增长,很少会修改Program,但是,会经常修改Startup。 例如,向项目中添加新的NuGet依赖项,通常需要在Startup添加相应的代码才能使用。
Startup类:配置应用程序
Startup类主要负责应用的两个方面的配置:
1、服务注册 - 您的应用程序所依赖的任何类 ,无论是框架使用的类还是应用程序自身需要使用的类都必须注册,只有这样,这些类才能在运行时被正常构建;
2、中间件和MVC - 应用程序如何处理和响应请求;
在不同的方法中配置这两个方面的功能,服务注册在方法ConfigureServices中,中间件和MVC 在方法Configure中。这两个方法大致的样子如下所示:

Program中创建的WebHostBuilder先调用 ConfigureServices 然后调用Configuare,如下图所示:每个调用都会配置应用程序的不同部分。由于这样的调用顺序,Configuare方法中可以使用在ConfigureServices方法中注册的任何服务。调用完成后,WebHostBuilder通过调用Build()方法,创建IWebHost. 有一个地方需要注意,Startup类自身没有实现相应的接口,WebHostBuilder通过反射来调用预义的方法Configure和ConfigureServices,这样的设计使这个类更加灵活,我们可以修改签名,添加额外的参数。更详细的细节将在后面章节介绍。

谢谢你的阅读,下节见!如果期待本系列,请点一下推荐!
《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1的更多相关文章
- 《ASP.NET Core In Action》读书笔记系列一 ASP.NET Core 的诞生
最近打算系统学习一下asp.net core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...
- 《ASP.NET Core In Action》读书笔记系列三 ASP.NET Core如何处理请求的?
在本节中,您将看到ASP.NET Core应用程序如何运行的,从请求URL开始到页面呈现在浏览器中. 为此,您将看到 一个HTTP请求在Web服务器中是如何被处理的.ASP.NET Core如何扩展该 ...
- asp.net MVC4 框架揭秘 读书笔记系列3
IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS ...
- 《ASP.NET Core In Action》读书笔记系列二 ASP.NET Core 能用于什么样的应用,什么时候选择ASP.NET Core
ASP.NET Core 能用于什么样的应用 ASP.NET Core 可以用作传统的web服务.RESTful服务.远程过程调用(RPC)服务.微服务,这归功于它的跨平台支持和轻量级设计.如下图所示 ...
- asp.net MVC4 框架揭秘 读书笔记系列2
1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...
- asp.net MVC4 框架揭秘 读书笔记系列1
1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...
- 《ASP.NET Core In Action》读书笔记系列,这是一个手把手的从零开始的教学系列目录
最近打算系统学习一下asp.net core ,苦于没有好的中文书藉,只好找来一本英文的 <ASP.NET Core In Action>学习.我和多数人一样,学习英文会明显慢于中文.希 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
随机推荐
- CentOS 7 下安装 teamviewer 13
CentOS 版本:centos-release-7-4.1708.el7.centos.x86_64(通过 rpm -q centos-release 查询) teamviewer 版本:teamv ...
- BZOJ.4009.[HNOI2015]接水果(整体二分 扫描线)
LOJ BZOJ 洛谷 又是一个三OJ rank1!=w= \(Description\) (还是感觉,为啥非要出那种题目背景啊=-=直接说不好么) 给定一棵树和一个路径集合(每条路径有一个权值).\ ...
- 使用CSS达到文字首尾对齐效果
在制作表单的时候经常会遇到需要不同个数的文字首尾对齐,比如: <span>姓名:</span> <span>联系方式:</span> 姓名: 联系方式: ...
- Do-Now—团队冲刺博客四
各个成员今日完成的任务 侯泽洋:完成奖励页面设计,完成奖励从云端拉取到本地:完成奖励从云端拉取到本地 周亚杰:冲刺博客,个人中心设计(未完成) 王志伟:积分页面设计:积分页面设计 仇夏:树苗成长过程设 ...
- Python字符串的相关操作
1.大小写转换 判断字符串 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.islower() #所有字 ...
- helm-chart7,调试与hook
调试 几个命令可以帮助进行调试 helm lint 首选工具,返回错误和警告信息. helm install --dry-run --debug:服务器会渲染你的模板,然后返回结果清单文件. helm ...
- 那些年我们跳过的 IE坑
一, IE input X 去掉文本框的叉叉和密码输入框的眼睛图标 解: 从IE 10开始,type=”text” 的 input 在用户输入内容后,会自动产生一个小叉叉(X),方便用户点击清 ...
- php获取文章的第一张图片
今天做东西的时候遇到一个问题就是如何把文章提取出来作为文章列表呢? 因为用了Ueditor,所以提交的数据包含了html标签. 搜索了一会找到了一个方案,用php自带的函数去掉了html标签. $ar ...
- jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题
jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题 之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一 ...
- python语法_字典_字典操作
字典:使用映射关系来存储数据的 数据类型 dict = {''name“:"gm","age":"34"} 采用键值对来存储数据 key_v ...