版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、重慶科技學院 XXXX設計課程設計報告 學 院: 電氣與信息工程學院_ 專業(yè)班級: 計科普10-02 學生姓名: 唐柳 學 號: 201044189 設計地點(單位)_ _I520_ _ _ 設計題目: WEB服務器 完成日期: 2013 年1月12日 指導教師評語: _ _ _ 成績(五級記分制):_ _ 指導教師(簽字):_ _ 26摘要本專題將針對HTTP協(xié)議定義一個Web服務器,我們平常瀏覽網(wǎng)頁通過在瀏覽器中輸入一個網(wǎng)址就可以看到我們想要的網(wǎng)頁,這個過程中瀏覽器只是一個客戶端,瀏覽器(應用層應用程序)通過HTTP協(xié)議把用戶請求發(fā)送到服務端, 服務器接受到發(fā)送來的HTTP請求,然后對請求
2、進行處理和響應,最后把響應的內(nèi)容發(fā)送給客戶端(瀏覽器這里充當了用戶代理的客戶端),瀏覽器再對接受到的響應內(nèi)容(一般是HTML文件)進行解釋并且顯示出來。這就是一次完整的用戶請求/響應模型,本專題所講述的是一個簡單的Web服務器,其他一些大型的Web服務器(IIS,Apache)也是這樣的一個原理, 本專題只是簡單講述Web服務器的實現(xiàn)原理。關鍵字:HTTP協(xié)議 客戶端 web服務器目錄1.概要11.1 C#軟件實現(xiàn)原理11.2 HTTP協(xié)議的作用原理12.界面設計32.1 服務器界面32.2 服務器界面控件33.實現(xiàn)流程54.服務器編程64.1 設計HTTP web服務器64.1.1創(chuàng)建Tcp
3、Listener對象64.1.2接受客戶端請求64.1.3讀取請求內(nèi)容75.測試web服務器135.1 實驗準備135.1.1 創(chuàng)建文件夾135.1.2 保存測試網(wǎng)頁及圖片135.2 訪問web服務器虛擬目錄下的網(wǎng)頁和圖片155.2.1訪問網(wǎng)頁顯示不全面155.2.2 訪問網(wǎng)頁中的圖片165.2.3 訪問網(wǎng)頁正常165.3 訪問網(wǎng)頁錯誤信息186.C#安裝軟件設計197.總結23致謝24參考文獻251.概要一個 Web 服務器也被稱為 HTTP 服務器,它通過 HTTP 協(xié)議與客戶端通信。這個客戶端通常指的是Web瀏覽器。1.1 C#軟件實現(xiàn)原理C#實現(xiàn)WEB服務器、HTTP協(xié)議的作用原理:W
4、WW是以Internet作為傳輸媒介的一個應用系統(tǒng),WWW網(wǎng)上最基本的傳輸單位是Web網(wǎng)頁。WWW的工作基于客戶機/服務器計算模型,由Web 瀏覽器(客戶機)和Web服務器(服務器)構成,兩者之間采用超文本傳送協(xié)議(HTTP)進行通信。HTTP協(xié)議是基于TCP/IP協(xié)議之上的協(xié)議,是Web瀏覽器和Web服務器之間的應用層協(xié)議,是通用的、無狀態(tài)的、面向對象的協(xié)議。1.2 HTTP協(xié)議的作用原理HTTP協(xié)議的作用原理包括四個步驟:1)連接:Web瀏覽器與Web服務器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志著連接建立成功。2)請求:Web瀏覽器通過socket向Web
5、服務器提交請求。HTTP的請求一般是GET或POST命令(POST用于FORM參數(shù)的傳遞)。GET命令的格式為:GET 路徑/文件名 HTTP/1.0。文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。3)應答:Web瀏覽器提交請求后,通過HTTP協(xié)議傳送給Web服務器。Web服務器接到后,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。例:假設客戶機與www.17:8080/cq.htm建立了連接,就會發(fā)送GET命令:GET cq.htm HTTP/1.0。主機名為17的We
6、b服務器從它的文檔空間中搜索子目錄的文件cq.htm。如果找到該文件,Web服務器把該文件內(nèi)容傳送給相應的Web瀏覽器。為了告知 Web瀏覽器傳送內(nèi)容的類型,Web服務器首先傳送一些HTTP頭信息,然后傳送具體內(nèi)容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。常用的HTTP頭信息有: HTTP 1.0 200 OK:這是Web服務器應答的第一行,列出服務器正在運行的HTTP版本號和應答代碼。代碼“200 OK”表示請求完成。 MIME_Version:1.0:它指示MIME類型的版本。 content_type:類型:這個頭信息非常重要,它指示HTTP體信息的MIME
7、類型。如:content_type:text/html指示傳送的數(shù)據(jù)是HTML文檔。 content_length:長度值:它指示HTTP體信息的長度(字節(jié))。4)關閉連接:當應答結束后,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連接。2.界面設計2.1 服務器界面作為服務器,即使是GUI界面,也應當簡潔為好。本程序將服務器配置功能以圖形方式提供,但對于服務運行過程中的狀態(tài)監(jiān)控,仍舊采用字符顯示方式。本次使用了一個ListBox列表控件,將它的背景設置為黑色,并將其設置成為不可選擇,以模擬Dos命令行效果。界面顯示如下圖所示;圖 2.1 界面顯示2.2 服
8、務器界面控件軟件工程名為“MyWebServer”,程序界面上個控件的屬性描述如下表所示:表 1-1 web服務器界面控件描述名稱控件類型功能描述frmWebServerForm程序主窗體listBoxStatusViewListBox服務狀態(tài)控制欄tbxWebServerIpTextBox填寫服務IP地址tbxWebServerPortTextBox填寫服務端口號tbxWebRootTextBox設置填寫根目錄btnStartStopButton服務“啟動/停止”按鈕3.實現(xiàn)流程使用TcpListener類的方法實現(xiàn),流程如下圖所示。(1)首先web服務器以TcpListener類建立服務器
9、socket,對某個端口進行監(jiān)聽,實驗中的端口號是8080,以等待客戶端連接該端口。(2)處理客戶端的連接:建立客戶端連接,可以使用TcpListener類的AcceptSocket方法或者是AcceptTcpClient方法。AcceptSocket方法可以接受客戶端的請求,并且建立與客戶端的連接的Socket。(3)處理完數(shù)據(jù)傳送或接受:使用Socket類的Send與Receive方法傳輸及接受數(shù)據(jù)。(4)完畢時,關閉web瀏覽器和web服務器的Socket連接。圖 3.1 web服務器實現(xiàn)流程4.服務器編程4.1 設計HTTP web服務器4.1.1創(chuàng)建TcpListener對象(1)開
10、始監(jiān)聽端口 InstanceLst=new TcpListener(IPAddress.Parse(tbxWebServerIp.Text),int.Parse(tbxWebServerPort.Text); InstanceLst.Start();(2)同時啟動一個監(jiān)聽進程”StartListen“ ListTh = new Thread(new ThreadStart(StartListen); ListTh.Start();(3)其中,IstanceLst是TcpListener類的對象,ListTh是監(jiān)聽線程,它們的定義如下: private TcpListener InstanceL
11、st = null; private Thread ListTh;4.1.2接受客戶端請求while (true) Socket mySocket = InstanceLst.AcceptSocket(); listBoxStatusView.Items.Add("Socket 類型:" + mySocket.SocketType); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (mySocket.Connected) listBoxStatusView.Items.Add("
12、;客戶端連接 IP" + mySocket.RemoteEndPoint.ToString(); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; ./讀取請求內(nèi)容,返回數(shù)據(jù) mySocket.Close(); 這里用InstanceLst對象的AcceptSocket()方法接受客戶端的請求,并且建立于客戶端連接的Socket(mySocket)。4.1.3讀取請求內(nèi)容(1)在連接成功后,服務器取得web瀏覽器的HTTP請求,使用Socket類的Receive方法取得該請求。代碼如下:Byte bRece
13、ive = new byte1024;try int i = mySocket.Receive(bReceive, bReceive.Length, 0); catch (Exception e) listBoxStatusView.Items.Add(e.ToString(); break; (2)轉換成字符串類型,服務器將取得的HTTP請求內(nèi)容轉換成字符串,存儲在緩沖區(qū)sBuffer中,以便下面處理。 string sBuffer = Encoding.ASCII.GetString(bReceive);(3)HTTP協(xié)議本身比較復雜,只處理簡單客戶請求的GET方法,該方法是客戶端請求下載
14、web網(wǎng)頁的方法,是最常用的。對GET請求進行處理代碼如下:1)只處理 “GET”請求類型if (sBuffer.Substring(0, 3) != "GET") listBoxStatusView.Items.Add("只處理”GET“請求類型!");mySocket.Close(); return; 2)查找”HTTP“的位置 iStartPos = sBuffer.IndexOf("HTTP", 1); string sHttpVersion = sBuffer.Substring(iStartPos, 8);3)得到請求類型
15、和文件目錄文件名 sRequest = sBuffer.Substring(0, iStartPos - 1); sRequest.Replace("", "/");4)如果結尾不是文件名也不是以”/”結尾,則加“/“ if (sRequest.IndexOf(".") < 1) && (!sRequest.EndsWith("/") sRequest = sRequest + "/" 5)得到請求文件名 iStartPos = sRequest.LastIndexOf(&
16、quot;/") + 1; sRequestedFile = sRequest.Substring(iStartPos);6)得到請求文件目錄 sDirName = sRequest.Substring(sRequest.IndexOf("/"), sRequest.LastIndexOf("/") - 3);經(jīng)過上面的處理,web服務器從HTTP請求報文中,解析出客戶端想要瀏覽資源的文件名和其所在目錄。(4)默認這個文件所在目錄就是用戶在軟件界面的“根目錄”一欄所填寫的路徑,也就是服務器的程序代碼中定義的虛擬目錄,而這里我們注重的一點就是我在
17、尋找路徑的時候,是尋找當前路徑,這樣對我們來說方便很多。代碼如下所示:1)獲取虛擬目錄物理路徑sLocalDir = sMyWebServerRoot;listBoxStatusView.Items.Add("請求文件目錄:" + sLocalDir);listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (sLocalDir.Length = 0) sErrorMessaage = "<H2>錯誤!請求目錄不存在<H2><Br>" Sen
18、dHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); mySocket.Close(); continue; if (sRequestedFile.Length = 0) /取得請求文件名 sRequestedFile = "index.html" 2)取得請求文件類型(設定為text/html) String sMimeType = &q
19、uot;text/html" sPhysicalFilePath = sLocalDir + sRequestedFile; listBoxStatusView.Items.Add("請求文件:" + sPhysicalFilePath); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (File.Exists(sPhysicalFilePath) = false) sErrorMessaage = "<H2>404 Error!File Does Not
20、 Exits.<H2>" SendHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); listBoxStatusView.Items.Add(sFormattedMessage); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; else int iTotBy
21、tes = 0; sRequest = "" FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader reader = new BinaryReader(fs); byte bytes = new bytefs.Length; int read; while (read = reader.Read(bytes, 0, bytes.Length) != 0) sResponse = sResponse + En
22、coding.ASCII.GetString(bytes, 0, read); iTotBytes = iTotBytes + read; reader.Close(); fs.Close(); SendHeader(sHttpVersion, sMimeType, iTotBytes, "200 ok", ref mySocket); SendToBrowser(bytes, ref mySocket); 處理結束后,向客戶端返回響應數(shù)據(jù)。(5)如上面的代碼所示,視處理結果向客戶端瀏覽器發(fā)送出不同的響應。1)如果客戶請求的文件不存在,則返回錯誤信息。if (File.Ex
23、ists(sPhysicalFilePath) = false) sErrorMessaage = "<H2>404 Error!File Does Not Exits.<H2>" SendHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); listBoxStatusView.Items.Add(sFormatted
24、Message); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; 2)如果文件存在,則返回網(wǎng)頁內(nèi)容至客戶端web瀏覽器,代碼如下所示。else int iTotBytes = 0; sRequest = "" FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader reader = new BinaryReader(fs); b
25、yte bytes = new bytefs.Length; int read; while (read = reader.Read(bytes, 0, bytes.Length) != 0) sResponse = sResponse + Encoding.ASCII.GetString(bytes, 0, read); iTotBytes = iTotBytes + read; reader.Close(); fs.Close(); SendHeader(sHttpVersion, sMimeType, iTotBytes, "200 ok", ref mySocket
26、); SendToBrowser(bytes, ref mySocket); 由上述程序可以看出,web服務器響應客戶端是分兩步動作完成的:(6)返回HTTP響應頭,用SendHeader()方法。所有HTTP響應頭的第一行都是狀態(tài)行,該行內(nèi)容依次是當前HTTP版本號,3位數(shù)字組成的狀態(tài)碼,以及描述狀態(tài)的短語,各項之間用空格分隔。狀態(tài)行之后是標頭信息。一般情況下,服務器會返回一個名為Data的標頭,表示響應生成的日期與時間,同時服務器還可能會返回一些關于自身的信息。接下來兩個標頭是Content-Type和Content-Length。再返回信息中,首部Content-Type指定了MIME類
27、和HTML(text/html),編碼類型是GB2312。下面代碼就是用SendHeader()方法給響應頭個字段賦值。/HTTP響應頭 public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) String sBuffer = "" if (sMIMEHeader.Length = 0) sMIMEHeader = "text/html" / 默認 text/html sB
28、uffer = sBuffer + sHttpVersion + sStatusCode + "rn" sBuffer = sBuffer + "Server: cx1193719-brn" sBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "rn" sBuffer = sBuffer + "Accept-Ranges: bytesrn" sBuffer = sBuffer + "Content-Length: " +
29、iTotBytes + "rnrn" Byte bSendData = Encoding.ASCII.GetBytes(sBuffer); SendToBrowser(bSendData, ref mySocket); listBoxStatusView.Items.Add("總字節(jié):" + iTotBytes.ToString(); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; (7)返回響應數(shù)據(jù)(包含網(wǎng)頁內(nèi)容),用SendToBrowser()方法。HTTP響應數(shù)據(jù)。它
30、是web服務器向瀏覽器返回信息的主體部分,在不出錯的條件下,它所包含的就是所請求資源的HTML源文件內(nèi)容。對于客戶端瀏覽器來說,它接收到HTTP響應后,會自動分析HTML源文件,然后將其顯示出來,這就是通過瀏覽器看到的頁面。下面代碼就是用SendToBrowser()方法返回響應數(shù)據(jù)。/返回相應數(shù)據(jù) public void SendToBrowser(String sData, ref Socket mySocket) SendToBrowser(Encoding.ASCII.GetBytes(sData), ref mySocket); public void SendToBrowser(B
31、yte bSendData, ref Socket mySocket) int numBytes = 0; try if (mySocket.Connected) if (numBytes = mySocket.Send(bSendData, bSendData.Length, 0) = -1) listBoxStatusView.Items.Add("Socket出錯!無法發(fā)送數(shù)據(jù)包"); else listBoxStatusView.Items.Add("發(fā)送字節(jié)數(shù)" + numBytes.ToString(); listBoxStatusView.
32、TopIndex = listBoxStatusView.Items.Count - 1; else listBoxStatusView.Items.Add("連接失敗!"); catch (Exception e) Console.WriteLine("發(fā)生錯誤:0", e.ToString(); 注意,這里并沒有指明客戶端使用的是那種請求類型,這是因為請求是客戶端發(fā)出的,客戶端自然知道每種類型的請求將返回什么樣的數(shù)據(jù),也知道如何處理服務器返回的數(shù)據(jù),所以不需要服務器告述它響應的是那種類型的請求。5.測試web服務器5.1 實驗準備5.1.1 創(chuàng)建文件
33、夾在web服務器編程中,我們已經(jīng)指定web服務器的虛擬目錄為“E:2012vs軟件MyWebServerMyWebServerbinDebugMyWebServerRoot,所以我在E盤中新建了一個文件夾,取名為” MyWebServerRoot“,可是在程序中我的尋找路徑,尋找當前目錄,這樣只是在實驗中比較方便。而后面我在將程序制作成軟件包后,我的文件路徑就是 C:Program FilesMicrosoftSetup1MyWebServerRoot。新建文件夾如下圖所示:圖 5.1 web服務器測試目錄5.1.2 保存測試網(wǎng)頁及圖片在接下來的實驗中,就以這個新建的文件夾作為服務器的根目錄,
34、用來存放測試用的各種資源。首先收集一些資源為下面進行的實驗做準備。上網(wǎng)訪問歡迎訪問重慶科技學院教務在線!-信息簡報重慶科技學院教務處網(wǎng)站(網(wǎng)址為圖 5.2 保存重慶科技學院信息簡報頁面作為測試頁面注意:在保存網(wǎng)頁時,要命名為全英文字母的文件名,這里取名為cq.htm。之所以這樣做是因為:我這個web服務器只能夠處理字符串形式的文件名,還不能支持中文的文件名。要使用服務器程序支持中文文件名,就必須實現(xiàn)漢字處理功能,那樣會極大的增加代碼量。保存好網(wǎng)頁后,順便也將我們網(wǎng)頁中所涉及到的圖片都保存到根目錄中去,最后在文件夾中顯示的就是網(wǎng)頁中所需要的圖片,樣式等資料。如下圖所示。圖 5.3 保存測試用的圖
35、片5.2 訪問web服務器虛擬目錄下的網(wǎng)頁和圖片如果想要證明web服務器是確定無疑有效的,那么將外網(wǎng)斷開,實驗照樣能夠進行,這樣就說明實驗是成功的。5.2.1訪問網(wǎng)頁顯示不全面啟動web服務器程序MyWebServer,程序已經(jīng)自動配置IP地址和端口號(17:0880本機地址),根目錄E:2012vs軟件MyWebServerMyWebServerbinDebugMyWebServerRoot這是放置測試資源的文件夾?,F(xiàn)在單擊啟動按鈕啟動服務器程序如下圖所示:5.4 啟動服務器服務器屏幕上顯示服務器啟動信息,此時“啟動”按鈕自動變成“停止”按鈕,用戶可隨時單擊它以停止we
36、b服務線程的運行。在電腦上面的瀏覽器中瀏覽服務器中已有的網(wǎng)頁,在地址欄中輸入17:8080/cq.htm(本次實驗沒有實現(xiàn)DNS域名解析功能,所以在訪問服務器的時候采用直接給出IP地址的方式),單擊鏈接按鈕或者直接回車,瀏覽顯示效果如下圖所示:圖 5.5 網(wǎng)頁瀏覽效果5.2.2 訪問網(wǎng)頁中的圖片從上圖中我們可以知道,程序能夠顯示頁面,但是顯示的頁面卻不完整,尤其在頁面上本來應該顯示圖片的位置都沒有正常的顯示出來,現(xiàn)在我們單獨訪問服務器上面的圖片。在瀏覽器中輸入17:8080/1.jpg后回車,顯示圖片如下圖所示:圖 5.6 圖
37、片顯示效果5.2.3 訪問網(wǎng)頁正常由上圖我們知道圖片可以正常的顯示出來,后面在上網(wǎng)查詢才知道,我們在實驗中所用到的圖片要與頁面在同一個目錄下面,所以我們就要將圖片全部保存到與頁面想同的目錄下,如下圖所示:圖 5.7 將頁面文檔與網(wǎng)頁資源放置在同一目錄下面現(xiàn)在我們在重新輸入17:8080/cq.htm回車,先在網(wǎng)頁的顯示效果圖如下所示:圖 5.8 完整網(wǎng)頁顯示效果圖現(xiàn)在我們在去看web服務器會發(fā)現(xiàn),顯示網(wǎng)頁這個過程中創(chuàng)建了很多個Socket,他們都是Stream類型的,并且web頁面上的各個資源是分別獨立加載到瀏覽器端的。沒加載完頁面上的一個資源就關閉它所對應的
38、Socket,當繼續(xù)加載新的資源時,又要用一個新創(chuàng)建的Socke連接,如下圖所示:圖 5.9web服務器上的多個Socket一個TCP連接只作為單個資源的下載之用,用完后服務器主動斷開連接,這正好符合萬維網(wǎng)的工作過程,因此將TCP連接成為短連接。5.3 訪問網(wǎng)頁錯誤信息程序中有寫到只要是端口不正常,地址不正確,虛擬目錄沒有找到,我們在訪問網(wǎng)頁的是時候就會給我們錯誤信息的提示。(1)下圖就是我們在訪問網(wǎng)站17:8080/cq1.htm的時候由于虛擬目錄錯誤,所以出現(xiàn)的提示。圖 5.10 虛擬目錄沒找到(2)下圖就是在我們訪問的地址14:8080/cq.htm出錯的時候,由于IP地址不對,所以根本就進不了服務器。圖 5.11 IP地址錯誤6.C#安裝軟件設計這個項目的主要功能就是講我寫的那個web服務器編寫成為一個安裝軟件,讓我們能夠把軟件考出去安裝,而不用打開vs2010軟件來運行程序,這樣讓我們在實驗中可以更加方便快捷。下面就是C#安裝軟件設計的步驟:(1)首先建立一個setup工程,打開vs2010軟件,在文件中新建項目彈出下圖的框架。圖 6.1 新建安裝軟件工程(2)然后在文件系統(tǒng)中的“應用程序文件夾”右擊“添加”文件夾,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨時環(huán)保志愿者招聘
- 2024年酒店餐飲業(yè)通風系統(tǒng)安裝與運營管理合同正規(guī)范本3篇
- 咖啡館裝修工程協(xié)議
- 2025年度幼兒足球比賽組織合同3篇
- 消防工程墊資施工協(xié)議
- 公共場所綠化帶圍墻修建合同模板
- 礦山綠化壓樁施工合同
- 2024年適用:綜合抵押借款協(xié)議3篇
- 員工晉升通道設計
- 項目合作實施合同
- 學術基本要素:專業(yè)論文寫作學習通超星期末考試答案章節(jié)答案2024年
- 2024年《中華人民共和國監(jiān)察法》知識測試題庫及答案
- 醫(yī)院醫(yī)用計量器具管理制度
- 科學與文化的足跡學習通超星期末考試答案章節(jié)答案2024年
- 2025屆高考語文復習:散文閱讀 課件
- 國家開放大學電大《文獻檢索(本科)》2024-2024期末試題及答案
- DB5334∕T 12.1-2024 地理標志證明商標 香格里拉藏香豬 第1部分:品種要求
- 6《人大代表為人民》(第1課時)(教學設計)2024-2025學年統(tǒng)編版道德與法治六年級上冊
- 國家環(huán)保部《自然保護區(qū)綜合科學考察規(guī)程》(環(huán)涵2022139號)
- 新開科室籌備工作計劃
- 稅務局重點稽查的180個風險點
評論
0/150
提交評論