今天看到一篇漫画,[3年.NET开发应聘大厂惨遭淘汰,如何翻身打脸面试官?],好多问题,一会儿还真的回答不了,这里对这些问题进行了整理,增长下脑容量,哈哈。俗话说不想当将军的士兵不是好士兵,不想当架构师的程序员,不是一个努力要进步的程序员,努力加油,不断学习。有人说架构师都是一批秃顶的人,程序员都是一群XX,其实现实是,架构师好多不是秃顶,不用担忧本身成了架构师变成秃顶,那都是吓人的。程序员也是懂得浪漫的,要否则那么多浪漫的程序,那么多酷炫的技巧都是怎么实现的。html
委托是一种引用类型,表示对具备特定参数列表和返回类型的方法的引用。委托用于将方法做为参数传递给其余方法。事件就是经过委托调用的方法。
例如:程序员
public class DelegateTest { public delegate int AddDelegate(int a, int b); //定义委托类型 public AddDelegate addDelegate; //定义委托 public event AddDelegate AddDelegateForEvent; //定义事件 public int Add(int a, int b) { Console.WriteLine($"a:{a},b:{b}"); return a + b; } //委托和事件的使用 public static void Test() { DelegateTest text = new DelegateTest(); text.addDelegate = text.Add; ; text.addDelegate(1, 2); text.AddDelegateForEvent += text.addDelegate; text.AddDelegateForEvent += text.addDelegate; text.AddDelegateForEvent(10, 20);//或者下面的使用 //AddDelegate d = text.AddDelegateForEvent; //d(10, 20); //结果 //a: 1,b: 2 //a: 10,b: 20 //a: 10,b: 20 } //Func和Action的使用 public static void Test2() { Func<int, int, int> add = (int a, int b) => { return a + b; }; Action<int, int> addVoid = (int a, int b) => { int c = a + b; }; } }
C#中委托这篇文章,对委托有更多的介绍。Fun和Action是微软封装的委托,一个有返回值,一个没有,C#高级功能(三)Action、Func,Tuple这篇文章介绍的比较详细。web
.NET的管道:在管道模型运行开始前,首先HTTP的请求被被传递到HttpRuntime类的一个实例中,而后这个实例对象检测请求并找到被接受的那个应用程序,接下来管道模型就使用HttpApplicationFactory对象来建立一个HttpApplication对象来处理这个请求(在此同时也将建立HttpContext,HttpRequest和HttpResponse),一个HttpApplication能够包含一系列HttpModule对象。面试
URL Routing Module →→ Matching Route Entry →→ Route Handle →→ Http Handle →→ Controller Factory →→ Controller →→ Action Invoker →→ Module Binders →→ Authentication Filter →→ Authorization Filter →→ Action Filter →→ Action Execution →→ Action Filter →→ Action Result
简单就是:Url →→ Route →→ Controller →→ Action →→ View数据库
其余的ASP.NET生命周期的文章,ASP.NET生命周期 , WebForm页面运行周期--页面关系api
中间件是一种装配到应用管道中以处理请求和响应的程序,使用Run、Map和Use扩展方法来配置请求委托。请求委托用于构建请求管道,处理每一个HTTP请求。每一个委托能够在下一个委托以前和以后执行操做。委托还能够决定不将请求传递给下一个委托,这称为请求管道的短路。短路一般是可取的,由于它避免了没必要要的工做。浏览器
public class Startup { //此处省略部分代码,建立一个新的Core web项目,能够自行查看 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方法中的就是中间件,中间件组件的顺序定义了在请求上调用它们的顺序,以及响应的相反顺序,此排序对于安全性,性能和功能相当重要。
经常使用的中间件顺序
1. 异常/错误处理
2. HTTP 严格传输安全协议,HTTP协议介绍
3. HTTPS 重定向
4. 静态文件服务器
5. Cookie 策略实施
6. 身份验证
7. 会话
8.MVC缓存
中间件例子:安全
public class LogMiddleware { private readonly RequestDelegate _next; public LogMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { Debug.WriteLine("程序运行 开始。"); await _next(context); Debug.WriteLine("程序运行 结束。"); } } public static class LogMiddlewareExtensions { public static IApplicationBuilder UseLog(this IApplicationBuilder app) { return app.UseMiddleware<LogMiddleware>(); } }
在Configure中 app.UseLog();就可,程序运行,会在VS调试输出的地方显示
程序运行 开始。
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "Index", controller = "Home"}. Executing action ----此处省略部分输出
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action WebCore.Controllers.HomeController.Index (WebCore) in 13.9555ms
程序运行 结束。服务器
数据库事物的四大特性:原子性、一致性、隔离性、持续性(永久性)。原子性:要么全作,要么全不作;一致性:事务执行的结果必须是使数据库从一个一致性状态变到另外一个一致性状态。一致性与原子性是密切相关的;隔离性:一个事务的执行不能被其余事务干扰;永久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务的隔离性:未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可串行化(Serializable )。未提交读:最低级别,任何状况都没法保证;已提交读:可避免脏读的发生;可重复读:可避免脏读、不可重复读的发生;串行化:可避免脏读、不可重复读、幻读的发生。举例:未提交读:A更新了数据没有提交B能够看到;已提交读:A更新了数据没有提交B看不到,提交以后能够看到;可重复读:A插入一条数据,提交以后,B看不到,B事物结束以后,在查询能够看到;可串行化:A执行完以后B才可执行。(全部的一切操做都是并行操做)
数据库中的锁:分为独占锁(即排它锁),共享锁和更新锁,细分又可分为表锁、行锁、页锁等。
为何须要所?当并发事务同时访问一个资源时,有可能致使数据不一致,所以须要一种机制来将数据访问顺序化,以保证数据库数据的一致性。
共享锁表示对数据进行select操做,多个事务能够同时为一个对象加共享锁。排他锁也叫写锁,排他锁表示对数据进行insert、update或delete操做,若是一个事务对对象加了排他锁,其余事务就不能再给它加任何锁了。更新锁在的初始化阶段用来锁定可能要被修改的资源,这能够避免使用共享锁形成的死锁现象。
SOA的全称是Service Oriented Architecture,即面向服务的架构。它能够根据需求经过网络对应用组件进行分布式部署、组合和使用,服务层是SOA的基础,能够直接被应用调用,从而有效控制系统松耦合。简单来讲就是A功能布置在A服务器,B功能布置在B服务器,他们都开放出接口供C。。等访问,C不用知道A,B是如何实现的,只管用就能够了。简单的例子webservice、WCF、web api等等。
SOA框架的文章,Web Service 和WCF的比较
个人理解是:SOA和微服务是一脉相承的,二者都是中立性,语言无关,协议跨平台。微服务的目的是有效的拆分应用,服务的细粒度,重用组合,甚至是每一个操做(或方法)都是独立开发的服务,足够小到不能再进行拆分。SOA更适合大型企业中的业务过程编排、应用集成。
C#源码文件 →→ C#编译器 →→ 程序集 →→ 本机语言
底层的库:CLR(Common Language Runtime)公共语言运行时,CTS(Common Type System)通用类型系统,CLS(Common Language Specfication)公共语言规范,CIL(Common Intermediate Language)公共中间语言,CLI(Common Language Infrastructure)公共语言基础结构
DNS查询 →→ TCP连接 →→ HTTP请求 → 服务器响应 →→ 客户端渲染(HTML,CSS,JS)
中介者模式是用来下降类类之间的耦合的,由于若是类类之间有依赖关系的话,不利于功能的拓展和维护,只要修改一个对象,其它关联的对象都得进行修改,若是使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行。房产中介、QQ游戏平台、聊天室、QQ群和短信平台
应用服务和数据服务分离,使用缓存改善网站性能,使用应用服务器集群改善网站的并发处理能力,数据库读写分离,使用反向代理和CDN加速网站响应,使用分布式文件系统和分布式数据库系统,使用NoSQL和搜索引擎,对业务拆分,创建分布式服务。
水平扩展:利用Nginx创建分布式系统,增长服务器,增长CPU
解决高并发问题:增长缓存、禁止用户重复操做、创建请求队列
对比IIS来讲,它依赖HTTP.SYS的内置程序来监听外部的HTTP请求,若是请求的是一个可访问的URL,HTTP.SYS会将这个请求交给IIS工做进程,把信息保存到HttpWorkRequest中,在相互隔离的应用程序域AppDomain中加载HttpRuntime,调用HttpRuntime的ProcessRequest方法,以后就是咱们的程序操做,最后返回数据流,并从新返回到HTTP.SYS,HTTP.SYS在将数据返回给客户端浏览器。
Win10下IIS配置图解、MVC项目发布图解、IIS添加网站图解。
Redis缓存秒杀的商品ID,数量,一个请求数量减小一个,数量等于0的时候,直接返回失败,成功的数据保存到消息队列中,以后保存到数据库,秒杀的商品比较少的,直接用一个线程安全的列表就能够了。