目錄:
1.虛擬路徑
1.1.特殊路徑標識“~” (~只能在伺服器控制項使用)
1.2. 舉例,用~,而不是/的好處。WebSite。
1.3.編程處理“~”
2.Request對象
ASP.NET中Server.MapPath() 和 Request.MapPath()使用區別
3.Response對象
4.Server對象
樣本:Server.Transfer(path)
1.虛擬路徑1.1.特殊路徑標識“~” (~只能在伺服器控制項使用)
和“/表示網站根目錄(網域名稱)、../表示上級目錄、./表示目前的目錄”等Http標準定位不一樣,~是ASP.Net定義的特殊符號,是ASP.Net內部進行定義推薦的用法,推薦資源定位都使用~從應用根目錄開始定義。應用根目錄和網站根目錄的區別在於:如果將一個應用部署到http://www.rupeng.com/search這個目錄下,應用的根目錄是“http://www.rupeng.com/search”,網站的根目錄是“http://www.rupeng.com/”(建立WebSite進行示範,因為不同的WebSite都是在同一個網站根目錄下的),因此最好用“~”,“~”並不會被瀏覽器認,因此ASP.Net會將這個路徑轉換為相對於網站的根目錄的全路徑再輸出到瀏覽器。 <a href="/a.aspx">/路徑</a> <a href="../a.aspx">../路徑</a> <a href="./a.aspx">./路徑</a> |
1.2. 舉例,用~,而不是/的好處。WebSite。
1.假如在這個位置用
http://localhost:4217/虛擬位址/虛擬路徑/Default.aspx
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://www.cnblogs.com/Cookie1.aspx">HyperLink</asp:HyperLink>
2.移動到這個位置
http://localhost:4217/虛擬位址/Default.aspx
3.就不能找到這個地址
如果使用~,就很好的解決這個問題了。
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Cookie1.aspx">HyperLink</asp:HyperLink>
1.3.編程處理“~”
- 如果在服務端控制項中(使用runat=server的控制項)會自動將“~”進行轉換,如果在HTML控制項或者需要在代碼中轉換的話可以使用VirtualPathUtility類中靜態方法進行虛擬路徑、全路徑等的轉換,比如VirtualPathUtility.ToAbsolute("~/a/b1.aspx")就是將虛擬路徑轉換為相對於應用根的全路徑,也就是/WebSite4/a/b1.aspx
- (*)VirtualPathUtility類主要方法:string AppendTrailingSlash(string virtualPath):如果路徑virtualPath最後沒有“/”則添加;string Combine(string basePath, string relativePath),將兩個路徑進行合并;string GetDirectory(string virtualPath),返回虛擬路徑的目錄部分;string MakeRelative(string fromPath, string toPath),計算兩個虛擬路徑的相對路徑;ToAbsolute,轉換為絕對路徑
2.Request對象
- 1、 (*) Request.AppRelativeCurrentExecutionFilePath,擷取當前執行請求相對於應用根目錄的虛擬路徑,以~開頭,比如“~/Handler.ashx”,
Response.Write("擷取當前執行請求相對於應用根目錄的虛擬路徑AppRelativeCurrentExecutionFilePath:" + Request.AppRelativeCurrentExecutionFilePath);
- 2、 (*) Request.PhysicalApplicationPath,擷取當前應用的實體路徑,比如D:\我的文件\Visual Studio 2008\WebSites\WebSite4\
- 3、 (*) Request.PhysicalPath,擷取當前請求的實體路徑,比如D:\我的文件\Visual Studio 2008\WebSites\WebSite4\Handler.ashx
- 4、 (*) Request.RawUrl 獲得原始請求URL、Request.Url獲得請求的URL,區別涉及到URL重寫的問題
- 5、Request.UrlReferrer 網頁的來源,可以根據這個判斷從百度搜的哪個關鍵詞、防下載盜鏈、防圖片盜鏈,可以偽造(比如迅雷)。"本圖片僅供如鵬網內部交流使用",在DZ中測試。全域防盜鏈用Globals.asax
- 6、Request.UserHostAddress 獲得訪問者的IP地址
- 7、 (*) Request.UserLanguages 獲得訪問者瀏覽器支援的語言,可以通過這個實現對不同語言的人顯示不同語言的頁面。
- 8、Request.Cookies 擷取瀏覽器發過來的瀏覽器端的Cookie,從它裡面讀取Cookie值,比如context.Request.Cookies["mysessionid"],使用Request.Cookies 的時候一般只是讀取,將Cookie寫回瀏覽器要用Response.Cookies
- 9、Request.MapPath(virtulPath) 將虛擬路徑轉換為磁碟上的實體路徑,(相當於Server.Mappath())
Request.MapPath("~/a/b.aspx")就會得到D:\2008\WebSites\WebSite4\a\b.aspx
ASP.NET中Server.MapPath() 和 Request.MapPath()使用區別
Server.MapPath(string):是將相對於當前調用檔案的檔案(或目錄)映射為實體路徑;
Request.MapPath(string):是將string虛擬路徑映射為實體路徑(asp中Request無此方法)
Server.MapPath(string)中string可以用“../”方式引用父目錄,甚至可以將此目錄跳到整個WEB目錄外,如:C:\WWWROOT
目錄為WEB根目錄,在根目錄檔案中調用此Server.MapPath("../xyz.gif"),則可以調用WEB目錄外的指令碼、資源等。
Request.MapPath(string)中的string為虛擬目錄,只能相對WEB虛擬目錄形式的,也不允許"../"方式調用,只能是"/","/xx"等字串
有時候直接用Server.MapPath(string)調用一個檔案比較麻煩,因為不同的目錄中調用同一個Server.MapPath(string)函數就會得到不同的值,特殊的話,就需要通過判斷本身目錄層次才能擷取正確的地址,使用的Request.MapPath(string)就可以調用同一個目錄檔案。不用做目錄判斷
3.Response對象
- 響應的緩衝輸出:為了提高伺服器的效能,ASP.Net向瀏覽器Write的時候預設並不會每Write一次都會立即輸出到瀏覽器,而是會快取資料,到合適的時機或者響應結束才會將緩衝區中的資料一起發送到瀏覽器。
- Response對象的主要成員:
- 1、Response.Buffer、Response.BufferOutput:經過Reflector反編譯,發現兩個屬性是一樣的,Buffer內部就是調用的BufferOutput。這個屬性用來控制是否採用響應緩衝,預設是true。
- 2、Response.Flush() 將緩衝區中的資料發送給瀏覽器。這在需要將Write出來的內容立即輸出到瀏覽器的場合非常適用。案例:大批量資料的匯入,顯示正在匯入第*條資料,用Thread.Sleep類比耗時。
- 3、Response.Clear() 清空緩衝區中的資料,這樣在緩衝區中的沒有發送到瀏覽器端的資料被清空,不會被發送到瀏覽器。在用aspx輸出非html的例子中經常看到用clear來輸出httpmodule等給附加的內容(不推薦,推薦用ashx)
- 4、Response.ContentEncoding 輸出資料流的編碼。
- 5、Response.ContentType 輸出資料流的內容類型,比如是html(text/html)還是普通文本(text/plain)還是JPEG圖片(image/JPEG)。
- 6、Response.Cookies 返回給瀏覽器的Cookie的集合,可以通過它設定Cookie
- 7、Response.OutputStream 輸出資料流,在輸出圖片、Excel檔案等非常值內容的時候要使用它
- 8、Response.End() 終止響應,將之前緩衝中的資料發給瀏覽器,End()之後的代碼不會被繼續執行。在終止一些非法請求的時候,比如盜鏈等可以用End()立即終止請求。
- 9、Response.Redirect(url) 重新導向瀏覽器到新的網址。即可以重新導向到站外網址也可以重新導向到站內網址。Response.Redirect("http://www.rupeng.com")、Response.Redirect("a.htm")。Redirect是向瀏覽器發回302重新導向,是通知瀏覽器“請重新訪問url這個網址”,這個過程經曆了伺服器通知瀏覽器“請重新訪問url這個網址”和瀏覽器接到命令訪問新網址的過程。使用HttpWatch查看整個響應過程的Http報文。用Redirect因為是瀏覽器自己去重新訪問新網址的,所以在地址欄中是可以看到網址的變化的。後面會用來防止重新整理瀏覽器時提示“重試”。
- 10、Response.SetCookie(HttpCookie cookie),向輸出資料流中更新寫到瀏覽器中的Cookie,如果Cookie存在就更新不存在就增加。是對Response.Cookies的簡化調用。
- 11、Response.Write() 向瀏覽器輸出內容。
- 12、(*)Response.WriteFile(filename) 向瀏覽器輸出檔案。比如Response.WriteFile("c:/boot.ini")
4.Server對象
- Server是context的一個屬性,是HttpServerUtility類的一個對象
- Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是對HttpUtility類中相應方法的一個代理調用。個人推薦總是使用HttpUtility,因為有的地方很難拿到Server對象。別把HtmlEncode、UrlEncode混了,UrlEncode是處理超連結的, HtmlEncode是處理html代碼的。
- Server.Transfer(path) 內部重新導向請求,Server.Transfer("JieBanRen.aspx")將使用者的請求重新導向給JieBanRen.aspx處理,是伺服器內部的接管,瀏覽器是意識不到這個接管的,不是象Response.Redirect那樣經曆“通知瀏覽器‘請重新訪問url這個網址’和瀏覽器接到命令訪問新網址的過程”,是一次http請求,因此瀏覽器地址欄不會變化(聯想,話務中心坐席告訴客戶一個號碼和幫客戶轉接的區別)。因為是內部接管,所以在被重新導向到的頁面中是可以訪問到Request、Cookies等這些來源頁面接受的參數的,就像這些參數是傳遞給他的,而Redirect則不行,因為是讓瀏覽器去訪問的。注意Transfer是內部接管,因此不能像Redirect那樣重新導向到外部網站。 (常考)
樣本:
Tansfer.aspx
protected void Page_Load(object sender, EventArgs e) { string q = Request["q"]; if (q == "1") { Server.Transfer("http://www.baidu.com"); } else if(q =="2") { Response.Redirect("http://www.baidu.com"); } }
接收.aspx
protected void Page_Load(object sender, EventArgs e) { Response.Write( Request["q"]); }
- 使用Server.Transfer不能直接重新導向到ashx,否則會報錯“執行子請求出錯”。
- 有的時候不能拿到HttpContext對象,比如在Global.asax中(後面講),可以通過HttpContext.Current拿到當前的HttpContext,進而拿到Response、Request、Server等。
- Server.MapPath。如果拿不到Server則使用HostingEnvironment.MapPath()方法