日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.netcore基础知识(一)

發布時間:2024/3/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .netcore基础知识(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python微信訂餐小程序課程視頻

https://edu.csdn.net/course/detail/36074

Python實戰量化交易理財系統

https://edu.csdn.net/course/detail/35475

先來說說web服務器

先來一張圖 一個典型的進程外托管模型 我們先看kestrel這一部分 我們在它前面放了一個方向代理服務器nginx 對http請求做預處理 kestrel本身是可以直接用作web服務器的 但是其功能較弱 只有基礎功能 說白了就是一個弱化版的IIS 所以不建議直接將他暴露出來 一般會在前面加上一個反向代理服務器 當然圖中也可以將IIS作為反向代理服務器 但是這有點多此一舉了 我們可以直接用IIS 這時有IIS集成技術 會消耗更少資源 這時叫做進程內托管 所以其實一共就有兩種最優方案:

(1)確定要用IIS情況下 直接用IIS集成 進程內托管

(2)不確定要用IIS 建議Nginx/apache + Kestrel 這樣外部有一層反向代理 能有效做負載均衡,動靜分離,訪問控制,重定向等等 kestrel僅僅用來處理http請求

然后來講講Host主機

Program類就是用來創建主機的

public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup();});}

看一下這段代碼 是不是很眼熟? Core的main方法就在這里 這是程序的入口 我們看一下他做了什么

CreateHostBuilder(args).Build().Run();

上面這句就是:創建主機生成器 ----> 配置主機 ----> 創建主機 ----> 運行主機底下那個方法是前兩步 從 .Build().Run() 這兩步就是后面兩步主機有啥用? 微軟官方的說法是 ---- 主機負責應用程序啟動和生存期管理 說白了就是啟動程序和程序的生命周期的管理 主要用于配置服務器和請求處理管道。 主機還可以設置日志記錄、依賴關系注入和配置 就是一系列配置都是主機來做的

最后來講一下最重要的管道和中間件

public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllers();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}

看一下這段代碼 我們先看第一個方法?ConfigureServices 這個方法其實很多人都用過 它是用來配置IOC容器 因為Core最核心的點就在于我們要遵循依賴注入的原則 舉個例子 我們想要吃一個蘋果 我們要怎么做 當然是去商店買一個 而不是我們自己造一個?為啥呢?因為我們沒有造蘋果的圖紙啊 也就是說 我們想要造一個蘋果 首先我們需要一個造蘋果的圖紙 這樣其實我們就和蘋果類聯系在一起了 這個圖紙 在程序里就叫做構造方法 而例子里面的商店 其實就是IOC容器 我們想要蘋果就去商店買 我們不關心蘋果是怎么造出來的 都是商店來處理 我們就和蘋果解耦了 這就是非常典型的DI(依賴注入)思想 IOC容器其實就是反轉控制容器 幫我們造實例的容器 我們要的話直接找它拿就好了 我們就不用去 new() 對象了

話說回來?ConfigureServices 方法其實作用就是將我們這些“蘋果”進行注冊 說白了就是我們要給IOC容器提供構造方法吧 否則IOC容器也不知道怎么生產蘋果 那怎么注冊呢 請看下圖:

services.AddSingleton();services.AddTransient();services.AddScoped();

可以看出來 后面兩個泛型參數第一個是實現類的接口 第二個是實現類 一共是三種方法進行注冊 我們要怎么區分這三種方法呢?

(1)AddSingleton() 這個表示單例 首次請求會創建這個服務實例 應用程序生命周期中從頭到尾只有這一個實例存在

(2)services.AddTransient() 這個表示瞬時 每次請求或用到這個實例 全部都是重新創建的

(3)services.AddScoped() 這個表示在同一個http請求中 或者說同一個線程中 這個實例只會被創建一次 舉個例子 A依賴B 請求進來了 A在方法里多次使用了B 那這個B的實例 都是同一個 加入下一次請求來了 那么就不是同一個了

多提一句 系統本來就注冊好的服務是已經設定好生命周期的 假如我們要自定義服務 我們要給它設定生命周期 注意 若同一個服務接口我們多次注冊 后面會覆蓋前面注冊的

我們再來看第二個方法Configure 這個方法其實就是用來構建管道 增加中間件的

IApplicationBuilder 其實就是一個管道構建器 我們看到下面的方法不斷在app.UseXXX() 其實這都是擴展方法 其實都是在添加中間件 http請求進來 所有的一切 都是中間件 不論是什么控制器 服務類 路由 身份驗證… 全部都是中間件 中間件之間的關系是怎么樣的 執行順序是怎么樣的 這是一個難點 首先說執行順序 實際上中間件是從第一個開始 執行到最后一個 然后從最后一個一直到第一個進行返回 中間件原則是:1.能將請求傳遞給下一個中間件 2.能夠進行響應,使管道短路? 短路是非常有必要的 沒有短路就沒有返回了 假如我們沒有設置在最后的短路中間件 系統會有一個報錯的最后中間件 強制短路返回

執行順序很有意思 先看我們自己寫的自定義中間件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.Use(async (context, next) =>{await context.Response.WriteAsync("First Begin \r\n ");await next();await context.Response.WriteAsync("First End \r\n ");});app.Use(async (context, next) =>{await context.Response.WriteAsync("Second Begin \r\n ");await next();await context.Response.WriteAsync("Second End \r\n ");});app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World! \r\n");});});}

可以看到我們寫了兩個自定義中間件 我們直接運行 看看他們執行順序是咋樣的:

是不是很有意思!我們現在就能理解了 next()實際上就是一個去找下一個中間件的委托 或者說next其實就是下一個中間件 先按照順序執行第一個中間件 然后next去找下一個中間件 第二個中間件的begin執行 然后執行next 找到下面的helloworld 這時候沒有下一個輸出了 這時候就返回了 從helloworld 到第二個中間件里面的代碼 就到了第二個的end 然后返回到第一個中間件 就到了第一個的end 就是這樣一個順序

而且我們也可以自己寫中間件 就像我圖上所示?app.Use() 方法 一共兩個參數

public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware){throw null;}

第一個那個this是拓展方法用的 是一種方便用的簡寫 從第二個參數開始 我們看到實際上這個參數是一個委托 這個委托也有兩個參數 第一個是Http的上下文對象 第二個參數是一個Task型委托 其實就是我們的next 返回值也是一個Task 表明它指向的是一個異步方法

說白了 兩個參數其實就是?(context, next) 整體是異步的 所以前面要加 async 方法體里面調用的時候要用await? 因為next本身是異步方法

實際上在Core底層 next指向的就是下一個方法 委托其實就是一個函數指針 整體的處理是 先用一個List將所有中間件倒序放入 然后挨個取出 然后把反序第一個 也就是原先最后一個中間件當參數傳遞給前一個中間件的next 所以就能串起來 執行的時候第一個便可以根據next獲得下一個中間件 其實我們想一下 這不就是鏈表嗎 委托就是函數指針 鏈表里面的元素就是方法 不過都是用指針來處理的而已

最后還要提一點 要是我們寫自定義中間件 要用擴展方法 這是約定原則

總結

以上是生活随笔為你收集整理的.netcore基础知识(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 婷婷另类小说 | 牛牛影视一区二区三区 | 在线观看视频一区二区三区 | 亚洲女人天堂色在线7777 | 男人午夜天堂 | 夜夜嗨老熟女av一区二区三区 | 麻豆视频一区 | 午夜xxxxx| 日韩免费高清视频 | 亚洲韩国精品 | 淫语视频| 黄色字幕网 | 黄色大片aaa| 公侵犯一区二区三区 | 妺妺窝人体色www聚色窝仙踪 | 亚洲精品在线视频观看 | 影音先锋丝袜制服 | 精品国产中文字幕 | 精品三级电影 | 不卡中文字幕在线 | 国产日韩一区二区 | 久久久久久久久久久网 | 日韩成人高清视频在线观看 | 亚洲精品韩国 | 亚洲黄页网站 | 在线国产福利 | 91狠狠操| 中文字幕精品久久久久人妻红杏1 | 久久精品屋 | 澳门av在线| 国产日韩一区二区三免费高清 | 五月婷婷狠狠干 | 国产视频导航 | 东京干手机福利视频 | 麻豆av免费观看 | 波多野结衣一区二区三区在线 | 国产午夜精品一区二区三区四区 | 国产视频xxxx | 国产超碰在线 | av在线免费观看网站 | 精品无码人妻一区二区三 | 综合久久91 | 亚洲精品国产精品国自产网站按摩 | 四虎成人在线视频 | 韩国女主播裸体摇奶 | 一本—道久久a久久精品蜜桃 | 呦呦精品 | a在线看 | www狠狠操 | 日本高清无吗 | 久久综合色网 | 日本少妇高潮喷水xxxxxxx | 成年人免费在线视频 | 另类视频在线观看+1080p | 亚洲有吗在线 | 波多野结衣一区二区三区高清 | 免费看av软件 | 影音先锋成人资源 | 久久深夜视频 | 一级片中文 | 久久久青 | 国产成人免费视频 | 91网站永久免费看nba视频 | 少妇精品偷拍高潮白浆 | 亚洲精品www久久久久久 | 中文字幕在线免费观看视频 | 亚洲高清欧美 | 国产毛片久久 | 国产av毛片 | bbbbbbbbb毛片大片按摩 | 91香蕉在线视频 | 自拍偷拍 亚洲 | 久久精品色欲国产AV一区二区 | 91亚洲精品久久久蜜桃 | 国产精品久久九九 | 欧美精品欧美精品系列 | 欧美激情 一区 | 亚洲欧美日韩精品永久在线 | 国产精品一区二区三区免费在线观看 | 欧美精品久久久 | 亚洲免费在线视频观看 | 麻豆三级视频 | 捆绑调教sm束缚网站 | 岛国av网址 | 日韩第一页 | 色婷婷久久五月综合成人 | 男女久久久 | 操极品美女 | 日韩最新中文字幕 | 国产精品电影一区 | 黄色三级视频在线观看 | 欧美一级一区 | 国产一区二区不卡在线 | 日本午夜电影 | 三级福利视频 | 国产最爽的乱淫视频国语对白 | julia一区二区三区中文字幕 | 永久黄色网址 | 欧美最猛性xxxxx(亚洲精品) |