之前一直做netframework相关的开发,最近公司的项目想向微服务靠近,在经过各个技术选型之后,决定使用netcore。
但是理想很丰满,现实很骨感。在使用netcore进行微服务相关开发之前,先需要把netcore学会。自己工作也有个五六年了,从来没有做过一次正式的总结归纳,对使用到的技术也没有一个深入的理解,所以向借这次学习netcore机会,将自己的理解记录下来,如果有什么不对的,也欢迎广大同胞批评指正。
netcore的安装过程就不多说了,可以在安装VS时勾选net core安装项或直接从官方网站下载,本篇文章主要会描述一下netcore的web项目结构。
创建一个netcore web项目,创建完成后初始的结构如下图所示:
创建完之后肯定一脸懵逼,跟使用framework创建网站的项目还是有一定差别的,我们先看看几个不认识的文件:
launchSettings.json
程序的启用配置文件,用于程序的启用准备工作,我们可以在此文件中配置环境变量、启动端口等。
{ "iisSettings": { //当选择以IIS启动时 "windowsAuthentication": false, //是否开启windows身份验证 "anonymousAuthentication": true, //是否开启匿名身份验证 "iisExpress": { "applicationUrl": "http://localhost:11974/", //启动时的地址和端口号(端口随机的) "sslPort": 0 //SSL端口 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" //标志环境,有三个值:1.Development 开发环境 2.Staging 预发布环境 3.Production 生产环境 } }, "ExampleTest": { //选择以本地控制台方式启动时 删了这个节点 则不可使用控制台方式启动 "commandName": "Project", "launchBrowser": true, "launchUrl": "http://localhost:5000/", //启动时的端口 "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
_ViewImports.cshtml
用来统一指定View中需要饮用到的命名空间。在之前framework的Razor模式,每个View页面都需要分别添加using xxx之类的引用代码,而现在只需要在_ViewImports文件中添加一次,全部View都可使用。
@using com.netcore.www //
@using com.netcore.www.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers //释义:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_3_6_1-introduction-to-tag-helpers.html
_ViewStart.cshtml
指定模版页。
@{ Layout = "_Layout"; }
_ViewStart.cshtml文件一般情况下存在于Views文件夹下,但是Views下的文件夹中也可以以添加此文件。
如上图所示,Views文件与Home文件下各有一个_ViewStart.cshtml文件,执行顺序为:
2 > 1
需要注意的是:Home文件夹的视图使用的模版页由1指定。
appsettings.json
NetCore中不再支持原来的web.config配置文件,取而代之的是json或XML配置文件。
官方推荐的项目配置方式是使用appsettings.json 配置文件
其实将web.config 改为app.config 引入项目根目录,一样可以通过ConfigurationManager读取app.config内容
但是需要去除config文件中与需要的配置无关的内容,主要是<system.web>,<system.webServer>和<system.codedom>等典型asp.net标签
Programs.cs
netcore程序其实是使用一个控制台来启动web程序,而Programs.cs文件就是控制台的启动项
StartUp.cs
通过ConfigureServices和Configure方法,来完成依赖注入和中间件管道的搭建,个人认为是netcore最复杂也最重要的部分。
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } /// <summary> /// 注册程序所需的service /// </summary> /// <param name="services">Services.</param> public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); //注册MVC服务 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } /// <summary> /// 注册程序使用的中间件 指定程序如何响应每一个HTTP请求 /// </summary> /// <param name="app">App.必须有此参数</param> /// <param name="env">Env.程序环境 非必填</param> public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } }
Configure参数:
-
- IApplicationBuilder 参数为必须的
- IApplicationEnvironment: 提供访问应用程序属性。类似于ApplicationName、ApplicationVersion以及ApplicationBasePath,可在Startup的构造函数和Configure方法中使用
- IHostingEnvironment: 提供了当前的EnvironmentName、WebRootPath以及Web根文件提供者。可以在Startup的构造函数和Configure方法中使用
- ILoggerFactory: 提供了创建日志的机制。可以在Startup的构造函数或Configure方法在红使用
- IServiceCollection : 当前容器中各服务的配置集合。只能在ConfigureService方法中使用,只有在ConfigureService方法中配置后,此服务在应用程序中才变得可用