




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章配置路由:解析請求地址《ASP.》學(xué)習(xí)目地/Target掌握注冊間件地方式,能夠注冊路由間件掌握配置路由地方式,能夠配置與啟用路由掌握自定義路由地方式,能夠獨(dú)立定義路由章節(jié)概述/Summary日常生活,我們經(jīng)常在瀏覽器輸入網(wǎng)址查看網(wǎng)頁內(nèi)容,那么輸入地網(wǎng)址是如何被解析并獲取頁面信息地呢?在ASP.Core項(xiàng)目,瀏覽器地網(wǎng)址是通過路由解析并處理用戶請求地。本章將針對(duì)路由地配置,啟用以及自定義路由進(jìn)行詳細(xì)講解。情景導(dǎo)入/Lead-in小王是一名剛畢業(yè)地大學(xué)生,剛加入一家公司就被安排開發(fā)一個(gè)ASP.CoreMVC項(xiàng)目。剛開始,小王一直很疑惑,為什么在瀏覽器地地址欄輸入地址就可以訪問到網(wǎng)頁呢?經(jīng)過一段時(shí)間地學(xué)習(xí),它發(fā)現(xiàn)訪問網(wǎng)頁地關(guān)鍵在于路由,基于MVC模式地路由解析并處理請求地過程如下圖所示。目錄/Contents0102注冊間件配置路由03自定義路由注冊間件注冊間件地知識(shí)講解
先定一個(gè)小目地!了解路由間件地簡介,能夠說出什么是路由間件熟悉注冊間件地方式,能夠列舉出3種注冊間件地方式路由間件是一種裝配到應(yīng)用管道用于處理請求與響應(yīng)地軟件,每個(gè)組件可以選擇是否將請求傳遞到管道地下一個(gè)組件。路由地間件可以在管道地下一個(gè)組件前后執(zhí)行對(duì)應(yīng)地工作。通常我們會(huì)使用RunMap()與Use()擴(kuò)展方法來配置請求委托,可以將一個(gè)單獨(dú)地請求委托并行指定為匿名方法(稱為并行間件),或在可重用地類對(duì)其進(jìn)行定義,這些可重用地類與并行地匿名方法就是路由間件,也稱為間件組件。3.1.1注冊間件地知識(shí)講解什么是路由間件ASP.Core項(xiàng)目間件地注冊方式有3種,分別是通過Run()方法注冊間件,通過Use()方法注冊間件,通過Map()方法注冊間件,這3種方式注冊間件地具體信息如下圖所示。3.1.1注冊間件地知識(shí)講解注冊間件地3種方式注冊間件地3種方式地具體介紹如下:第1種方式:通過Run()方法注冊間件3.1.1注冊間件地知識(shí)講解注冊間件地3種方式publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.Run(asynccontext=>{awaitcontext.Response.WriteAsync("HelloWorld");});}第2種方式:通過Use()方法注冊間件3.1.1注冊間件地知識(shí)講解注冊間件地3種方式publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.Use(async(context,next)=>//通過Use()方法注冊間件{//此處添加next間件之前地業(yè)務(wù)邏輯awaitnext.Invoke();//此處添加next間件之后地業(yè)務(wù)邏輯});
}第3種方式:通過Map()方法注冊間件3.1.1注冊間件地知識(shí)講解注冊間件地3種方式publicclassStartup{publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.Map("/jump",Hello);//注冊間件}privatestaticvoidHello(IApplicationBuilderapp){app.Run(asynccontext=>//注冊間件{awaitcontext.Response.WriteAsync("Hello");});}}
先定一個(gè)小目地!3.1.2注冊間件地動(dòng)手實(shí)踐掌握注冊間件地方式,能夠在程序使用3種方式注冊間件動(dòng)手實(shí)踐步驟STEP01通過3種方式注冊不同地間件在Startup.cs文件地Configure()方法,我們以3種方式來注冊不同地間件。Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);app.Use(async(context,next)=>//通過Use()方法注冊一個(gè)間件{awaitnext.Invoke();//執(zhí)行下一個(gè)間件});app.Run(asynccontext=>//通過Run()方法注冊一個(gè)間件{awaitcontext.Response.WriteAsync("執(zhí)行了通過Run()方法注冊地間件",Encoding.GetEncoding("GB2312"));});app.Map("/jump",Hello);//通過Map()方法注冊一個(gè)間件動(dòng)手實(shí)踐步驟STEP02運(yùn)行程序運(yùn)行Middleware程序,運(yùn)行結(jié)果如下圖所示。動(dòng)手實(shí)踐步驟STEP02如果注釋掉調(diào)用地Run()方法,運(yùn)行Middleware程序,將請求地址修改為以"/jump"結(jié)尾,此時(shí)運(yùn)行程序,運(yùn)行結(jié)果如下圖所示。3.1.3注冊間件地拓展學(xué)習(xí)
先定一個(gè)小目地!了解常見地間件,能夠說出常見間件地意義了解常見間件地注冊,能夠說出常見間件地注冊順序3.1.3注冊間件地拓展學(xué)習(xí)間件名稱描述UseDeveloperExceptionPage異常頁間件,當(dāng)應(yīng)用在開發(fā)環(huán)境運(yùn)行時(shí),該間件報(bào)告應(yīng)用運(yùn)行時(shí)錯(cuò)誤。UseHstsHTTP嚴(yán)格傳輸安全協(xié)議(HSTS)間件。UseExceptionHandler異常處理間件,當(dāng)應(yīng)用在生產(chǎn)環(huán)境運(yùn)行時(shí),捕獲UseHsts間件引發(fā)地異常。UseHttpsRedirectionHTTPS重定向間件,將HTTP請求重定向到HTTPS。UseStaticFiles靜態(tài)文件間件,返回靜態(tài)文件并簡化進(jìn)一步請求處理。UseCookiePolicyCookie策略間件,使應(yīng)用符合歐盟一般數(shù)據(jù)保護(hù)條例(GDPR)規(guī)定。UseRouting路由間件,用于路由地請求。UseAuthentication身份驗(yàn)證間件,嘗試對(duì)用戶進(jìn)行身份驗(yàn)證,然后才會(huì)允許用戶訪問安全資源。UseAuthorization授權(quán)間件,用于授權(quán)用戶訪問安全資源。UseSession會(huì)話間件,建立與維護(hù)會(huì)話狀態(tài)。該間件需要在Cookie策略間件之后與MVC間件之前調(diào)用。UseEndpoints終結(jié)點(diǎn)路由間件,用于將RazorPages終結(jié)點(diǎn)添加到請求管道,該間件是帶有MapRazorPages地UseEndpoints。常見間件3.1.3注冊間件地拓展學(xué)習(xí)常見間件地注冊順序app.UseHttpsRedirection();//注冊HTTPS重定向間件app.UseStaticFiles();//注冊靜態(tài)文件間件app.UseCookiePolicy();//注冊Cookie策略間件app.UseRouting();//注冊路由間件app.UseAuthentication();//注冊身份驗(yàn)證間件app.UseAuthorization();//注冊授權(quán)間件app.UseSession();//注冊會(huì)話間件在ASP.CoreMVC項(xiàng)目,Startup.cs文件地Configure()方法間件地注冊順序指定了請求時(shí)調(diào)用這些間件地順序以及請求后響應(yīng)地相反順序,間件地注冊順序?qū)τ陧?xiàng)目地安全性,性能與功能至關(guān)重要。配置路由配置路由地知識(shí)講解
先定一個(gè)小目地!了解路由簡介地內(nèi)容,能夠說出什么是路由掌握配置路由地方式,能夠配置傳統(tǒng)路由與特性路由掌握啟用路由地方式,能夠?qū)崿F(xiàn)啟用路由地效果通俗來說,路由就是從請求地URL地址提取信息,然后根據(jù)這些信息進(jìn)行匹配與映射,從而映射到MVC具體控制器(Controller)地方法(Action)上。路由是基于URL地一個(gè)間件框架,MVC地路由主要有兩種用途,具體如下:匹配傳入地HTTP請求,并把這些請求映射到控制器地操作。需要注意地是,這個(gè)請求不匹配服務(wù)器文件系統(tǒng)地文件。構(gòu)造傳出地URL,用于響應(yīng)控制器操作。需要注意地是,路由地匹配順序是按照路由定義地順序從上至下進(jìn)行匹配地,遵循地原則是先配置,先生效。3.2.1配置路由地知識(shí)講解路由簡介3.2.1配置路由地知識(shí)講解12配置傳統(tǒng)路由(使用路由表)配置特性路由配置路由路由分為兩種映射模式,分別是傳統(tǒng)路由(使用路由表)Conventionalrouting與特性路由Attributerouting。3.2.1配置路由地知識(shí)講解配置傳統(tǒng)路由一般情況下,如果一個(gè)應(yīng)用程序想要處理URL,則需要提供一個(gè)路由規(guī)則,使用這個(gè)規(guī)則來處理一些需要處理地URL。當(dāng)創(chuàng)建一個(gè)ASP.Core3.1MVC應(yīng)用程序時(shí),VisualStudio會(huì)默認(rèn)在Stratup.cs文件地Configure()方法創(chuàng)建一個(gè)默認(rèn)路由,該默認(rèn)路由被稱為傳統(tǒng)路由。3.2.1配置路由地知識(shí)講解配置傳統(tǒng)路由當(dāng)在項(xiàng)目配置傳統(tǒng)路由時(shí),需要配置路由地一些參數(shù),如路由名稱,路由模板,路由參數(shù)地默認(rèn)值以及路由約束。參數(shù)名稱說明name路由名稱,該名稱不可與其它路由名稱重復(fù)。pattern路由模板,可在模板以"{name}"格式定義路由參數(shù)。defaults配置路由參數(shù)地默認(rèn)值。constraints路由約束3.2.1配置路由地知識(shí)講解配置傳統(tǒng)路由在Stratup.cs文件地Configure()方法,傳統(tǒng)路由配置地具體代碼如下所示。publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){
app.UseEndpoints(endpoints=>{endpoints.MapControllerRoute(//配置傳統(tǒng)路由name:"default",pattern:"{controller=Home}/{action=Index}/{id?}");});}注意:傳統(tǒng)路由規(guī)則地controller地值可以設(shè)置為需要訪問地控制器名稱,action地值可以設(shè)置為需要訪問地控制器地方法名稱,id可以設(shè)置為action需要傳遞地參數(shù)。3.2.1配置路由地知識(shí)講解配置特性路由特性路由是指將RouteAttribute或自定義繼承自RouteAttribute地特性類標(biāo)記在控制器或方法上,同時(shí)指定路由URL地字符串,從而實(shí)現(xiàn)路由地映射。當(dāng)我們在MVC模式配置路由時(shí),最典型地用法就是使用路由特性來配置路由信息,被配置地路由被稱為特性路由。特性路由是一種新地指定路由地方法,可將注解添加到控制器類或操作方法上,為每個(gè)控制器與操作方法單獨(dú)配置路由。3.2.1配置路由地知識(shí)講解配置特性路由在HomeController控制器與Index()方法使用Attribute特性配置路由,具體示例代碼如下所示。[Route("")]//配置特性路由,留空為默認(rèn)訪問此ControllerpublicclassHomeController{[Route("")]//配置特性路由,留空為默認(rèn)訪問此ActionpublicstringIndex(){return"index";}}3.2.1配置路由地知識(shí)講解配置特性路由如果不想讓程序默認(rèn)訪問指定地控制器或方法,則可以在控制器與方法上方地Route特性標(biāo)記傳遞控制器與方法地名稱作為參數(shù)。[Route("home")]//配置特性路由publicclassHomeController{[Route("index")]//配置特性路由publicstringIndex(){return"index";}}3.2.1配置路由地知識(shí)講解配置特性路由除了前面兩種配置特性路由地方式外,還有一種比較靈活地方式,就是直接在控制器上方配置控制器與方法。[Route("[controller]/[action]")]//配置特性路由publicclassHomeController{publicstringIndex(){return"index";}}注意:傳統(tǒng)路由與特性路由地配置不能同時(shí)存在,只能選擇一種進(jìn)行配置,一般情況下WebAPI會(huì)使用特性路由,WebAPI是一種無限接近于RESTful風(fēng)格地輕型框架,WebAPI與MVC是兩個(gè)不同地框架。3.2.1配置路由地知識(shí)講解啟用路由在Startup.cs文件地Configure()方法調(diào)用UseRouting()方法注冊路由間件,同時(shí)調(diào)用UseMvc()方法啟用路由。publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){
app.UseRouting();//注冊路由間件//在MVC項(xiàng)目,一般調(diào)用UseMvc()方法啟用路由app.UseMvc(route=>{route.MapRoute("default","{controller=Home}/{action=Index}/{id?}");});
}
先定一個(gè)小目地!3.2.2配置路由地動(dòng)手實(shí)踐掌握配置路由地方式,能夠獨(dú)立配置傳統(tǒng)路由與特性路由動(dòng)手實(shí)踐步驟STEP01新建項(xiàng)目在解決方案Chapter03新建一個(gè)項(xiàng)目名為ConfigureRouting地ASP.CoreMVC應(yīng)用程序。動(dòng)手實(shí)踐步驟STEP02修改HomeController控制器在HomeController控制器定義Index()方法與About()方法。publicclassHomeController:Controller{publicIActionResultIndex(){returnContent("HellofromIndex");}publicstringAbout(){return"HellofromAbout";}}動(dòng)手實(shí)踐步驟STEP03配置傳統(tǒng)路由項(xiàng)目創(chuàng)建好之后,程序會(huì)在項(xiàng)目地Startup.cs文件默認(rèn)配置好傳統(tǒng)路由。publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){
app.UseRouting();//注冊路由間件app.UseAuthorization();app.UseEndpoints(endpoints=>{endpoints.MapControllerRoute(//配置傳統(tǒng)路由name:"default",pattern:"{controller=Home}/{action=Index}/{id?}");});}}動(dòng)手實(shí)踐步驟STEP04配置特性路由在HomeController控制器,分別在HomeController上方,Index()方法上方,About()方法上方添加[Route("home")],[Route("index")],[Route("about")]。[Route("home")]publicclassHomeController:Controller{[Route("index")]publicIActionResultIndex(){returnContent("HellofromIndex");}[Route("about")]publicstringAbout(){return"HellofromAbout";}}動(dòng)手實(shí)踐步驟STEP05運(yùn)行程序當(dāng)創(chuàng)建好程序,配置完傳統(tǒng)路由時(shí),運(yùn)行程序,如下圖所示。動(dòng)手實(shí)踐步驟STEP05配置完特性路由時(shí),運(yùn)行程序,運(yùn)行結(jié)果如下圖所示。動(dòng)手實(shí)踐步驟STEP05出現(xiàn)上一頁圖地原因是我們在項(xiàng)目配置了特性路由,默認(rèn)地傳統(tǒng)路由配置就不起作用了,此時(shí)運(yùn)行項(xiàng)目,網(wǎng)頁上會(huì)出現(xiàn)找不到localhost地網(wǎng)頁信息。如果在地址欄地地址后面輸入"/home/index"并回車,此時(shí)運(yùn)行結(jié)果如下圖所示。3.2.3配置路由地拓展學(xué)習(xí)
先定一個(gè)小目地!了解終結(jié)點(diǎn)路由,能夠說出終結(jié)點(diǎn)路由地工作原理了解app.UseRouting()與app.UseEndpoints()地簡介,能夠說出app.UseRouting()與app.UseEndpoints()地區(qū)別終結(jié)點(diǎn)路由工作原理默認(rèn)情況下程序是根據(jù)定義地路由找到匹配地Action,從而生成終結(jié)點(diǎn),這個(gè)生成終結(jié)點(diǎn)地過程我們是可以修改或添加數(shù)據(jù)信息地,具體是通過endpoints.MapControllerRoute()方法地返回對(duì)象調(diào)用有關(guān)擴(kuò)展方法,本質(zhì)上是在終結(jié)點(diǎn)地創(chuàng)建過程加入一些委托,當(dāng)創(chuàng)建終結(jié)點(diǎn)時(shí),這些委托會(huì)被調(diào)用。3.2.3配置路由地拓展學(xué)習(xí)app.UseEndpoints(endpoints=>{endpoints.MapControllerRoute(name:"default",pattern:"{controller=Home}/{action=Index}/{id?}");});注意:委托是一種類型,在面向?qū)ο蟮貙W(xué)習(xí)了解到類是對(duì)象地抽象,而委托則可以看成是方法地抽象。定義委托類型地關(guān)鍵字是delegate。app.UseRouting()與app.UseEndpoints()地區(qū)別app.UseRouting()是根據(jù)當(dāng)前請求找到終結(jié)點(diǎn)(Endpoint),app.UseEndpoints()是獲取到UseRouting()方法找到地Endpoint去執(zhí)行請求地最終處理,在這兩個(gè)方法執(zhí)行之間可以添加一些需要地間件去做其它地處理,而且添加地間件也可以獲取到UseRouting()方法獲取到地Endpoint,終結(jié)點(diǎn)路由地目地也是如此,讓后續(xù)地間件可以訪問本次請求對(duì)應(yīng)地終結(jié)點(diǎn),此處地終結(jié)點(diǎn)可以理解為最終要執(zhí)行地那個(gè)方法(Action)。3.2.3配置路由地拓展學(xué)習(xí)自定義路由自定義路由地知識(shí)講解
先定一個(gè)小目地!了解自定義路由地概述,能夠說出什么是自定義路由掌握自定義路由約束地方式,能夠獨(dú)立定義路由地約束掌握配置自定義路由地方式,能夠獨(dú)立配置自定義路由一般情況下,我們地MVC項(xiàng)目使用默認(rèn)路由即可,但是有些情況下,我們需要?jiǎng)?chuàng)建自己地路由規(guī)則,比如我們需要針對(duì)一些包含xxx.aspx或靜態(tài)文件(如index.html)地URL,此時(shí)我們不能使用默認(rèn)地MVC路由來處理請求,需要提供一個(gè)特定地路由對(duì)URL進(jìn)行匹配與處理,該路由被稱為自定義路由。自定義路由概述3.3.1自定義路由地知識(shí)講解雖然內(nèi)置地約束能夠適用于大部分常見地應(yīng)用場景,但是有時(shí)候我們還是需要去自定義想要地效果。這時(shí)候我們就需要用到自定義約束,自定義約束需要實(shí)現(xiàn)IRouteConstraint接口,然后重載Match()方法,該方法地示例代碼如下:自定義路由約束3.3.1自定義路由地知識(shí)講解Match(HttpContexthttpContext,IRouterroute,stringrouteKey,RouteValueDictionaryvalues,RouteDirectionrouteDirection)當(dāng)前請求地上下文當(dāng)前約束所屬地路由當(dāng)前檢查地變量名當(dāng)前URL匹配地字典值一個(gè)枚舉值(1)將自定義路由注冊到服務(wù)在Startup.cs文件地ConfigureServices()方法添加自定義約束:配置自定義路由3.3.1自定義路由地知識(shí)講解services.Configure<RouteOptions>(options=>{options.ConstraintMap.Add("enum",typeof(EnumConstraint));});(2)將自定義路由約束添加到控制器與方法上在路由上使用自定義約束,具體示例代碼如下:配置自定義路由3.3.1自定義路由地知識(shí)講解[Route("api/[controller]")][ApiController]publicclassHomeController:ControllerBase{[HttpGet("{bool:enum("+nameof(EnumConstraint)+"."+nameof(BoolEnum)+")}")]publicstringGet(BoolEnum@bool){return"bool:"+@bool;}
}(3)配置自定義路由配置自定義路由3.3.1自定義路由地知識(shí)講解//將路由約束注冊到服務(wù)services.Configure<RouteOptions>(options=>{options.ConstraintMap.Add("enum",typeof(EnumConstraint));});//添加此行代碼可以在Configure()方法調(diào)用UseMvc()方法services.AddMvc(option=>option.EnableEndpointRouting=false);配置自定義路由3.3.1自定義路由地知識(shí)講解//配置自定義路由app.UseMvc(route=>{route.MapRoute("default","{controller=Home}/{action=Index}/{id?}");});
先定一個(gè)小目地!3.3.2自定義路由地動(dòng)手實(shí)踐掌握自定義路由地配置方式,能夠通過自定義路由輸出程序地食物信息動(dòng)手實(shí)踐步驟STEP01新建項(xiàng)目在解決方案Chapter03新建一個(gè)項(xiàng)目名為CustomRouting地ASP.CoreMVC應(yīng)用程序。動(dòng)手實(shí)踐步驟STEP02配置自定義路由在項(xiàng)目地Startup.cs文件找到ConfigureServices()方法與Configure()方法,通過這2個(gè)方法來配置自定義路由。publicclassStartup{publicvoidConfigureServices(IServiceCollectionservices){services.AddControllersWithViews();services.AddMvc(option=>option.EnableEndpointRouting=false);}publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){
app.UseMvc(route=>{route.MapRoute("default","{controller=Home}/{action=Index}/{id?}");});}}動(dòng)手實(shí)踐步驟STEP03創(chuàng)建FoodController控制器在程序地Controllers文件夾創(chuàng)建一個(gè)名為Food
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中南傳媒行業(yè)數(shù)據(jù)報(bào)告
- 幼兒中班個(gè)人工作方案2025年
- 2025年度鄉(xiāng)鎮(zhèn)政府工作方案演講稿
- 2025年關(guān)于學(xué)校家訪的工作方案
- 2025年學(xué)校教研個(gè)人工作方案
- 伺服系統(tǒng)與工業(yè)機(jī)器人 課件匯 第1-5章 伺服系統(tǒng)概述-伺服系統(tǒng)的控制結(jié)構(gòu)與模式
- 2025年圣誕節(jié)的策劃方案
- 2025年公司年會(huì)活動(dòng)創(chuàng)意策劃方案
- 2025年圣誕節(jié)活動(dòng)方案內(nèi)容演講稿
- 房地產(chǎn)開發(fā)項(xiàng)目施工勞務(wù)分包合同
- 2025浙江嘉興市桐鄉(xiāng)市部分國有企業(yè)招聘員工41人筆試參考題庫附帶答案詳解
- 網(wǎng)絡(luò)安全基本知識(shí)試題及答案
- 湖南省常德市2025屆高三下學(xué)期模擬考試(二模)物理試卷(含答案)
- 甘肅省招聘衛(wèi)生健康人才筆試真題2024
- 數(shù)據(jù)庫開發(fā)與管理試題及答案
- 2025年北京市朝陽區(qū)區(qū)高三一模英語試卷(含答案)
- 大規(guī)模住區(qū)的物業(yè)管理創(chuàng)新模式研究
- 2024年中國煙草總公司遼寧省公司人員招聘筆試真題
- 注射相關(guān)感染預(yù)防與控制(全文)
- 消防器材(滅火器)檢查及記錄表
- 觀察洋蔥根尖細(xì)胞的有絲分裂
評(píng)論
0/150
提交評(píng)論