個人學習筆記。
ASP.NET 是一個免費的 web 框架,用於使用 HTML、CSS 和 JavaScript 構建強大的網站和 web 應用程序。
get和 post
get是通過 URL 傳遞表單值,post 傳遞的表單值是隱藏到 http 報文中,在 URL 中是看不到的;此外,get 傳遞的數據量是有上限的,例如:type = “file”、type = “password” 和 是不能用 get 的;post 會有瀏覽器提示重新提交表單的問題。
Cookie
設置 Cookie:
Response.SetCookie(new HttpCookie("TEMP",tbSetCookie.Text));
讀取 Cookie:
lbGetCookie.Text = Request.Cookies["TEMP"].Value;
如果瀏覽器報 System.NullReferenceException 異常,是因爲沒有設置 Cookie;如果使用了 Internet Explorer 瀏覽器,那麼需要在同一頁面下打開兩個網站(一個設置,一個讀取),否則(兩個網站分別在兩個獨立頁面)也會報這個異常,但可以通過更換瀏覽器得到解決。
一些網站爲了降低傳輸 Cookie 的流量,把主站域名和圖片服務器設置爲不一樣。
Session
Session 有超時銷燬機制。
設置 Session:
Session["Data"] = tbSetSession.Text;
讀取 Session:
tbGetSession.Text = Convert.ToString(Session["Data"]);
HTTP 協議
HTTP 的工作方式是“請求——響應”,頁面會不斷地刷新,如果不希望如此可以使用 AJAX 等技術。
Connection
瀏覽器和服務器之間傳輸數據的通道。
Request
瀏覽器向服務器發送的請求信息,包含請求的類型、請求的數據和瀏覽器的信息。
Response
服務器對瀏覽器請求的返回數據。
HTTP 請求報文
網站頁面中的圖片、JS、CSS在單獨的請求中。每一個資源對應一個請求。
Accept-Encoding:gzip,deflate 表示瀏覽器支持 gzip 和 deflate 兩種壓縮算法。
Accept-Language:zh-cn 表示瀏覽器支持的語言,很多國際網站使用這個方法實現進入後自動中文界面。
Connection:Keep-Alive 一般情況下如果 Web 服務器向瀏覽器發送了請求數據,就會關閉 TCP 連接,但如果在瀏覽器或服務器頭信息中加上 Connection:keep-alive,則 TCP 會始終保持開啓狀態,且瀏覽器可使用相同的連接發送請求;保持持續的連接可以節省建立新連接的時間,也能節約網絡帶寬。
Cookie 是瀏覽器向服務器發送和當前網站關聯的 Cookie,這樣服務器也能夠讀取到瀏覽器的 Cookie。
User-Agent 是瀏覽器的版本信息。
HTTP 狀態碼
瀏覽器向服務器發出請求,服務器可能處理成功,也可能失敗。服務器會通過狀態碼來向瀏覽器傳達處理結果。常見的 HTTP 狀態碼:
響應碼 | 含義 |
---|---|
200 | OK 請求成功 |
301 | Moved Permanently 被請求資源已永久轉移位置 |
302 | Moved Temporarily 被請求的資源從不同URL響應 |
400 | Bad Request 錯誤請求 |
401 | Unauthorized 請求未認證 |
403 | Forbidden 拒絕執行請求 |
404 | Not Found 未找到相應資源 |
500 | Internal Server Error 服務器內部錯誤。一般是服務器端源代碼錯誤 |
503 | Service Unavailable 服務器維護或超載 |
200段是請求成功;300段是需要對請求做進一步處理;400段是客戶端請求錯誤;500段是服務器出現錯誤。
服務器返回的報文
Server: 表示服務器類型。
Content-Type:text/html;charset=utf-8 表示返回數據的類型。常用的有 text/html、image/GIF、image/JPEG、text/plain、text/javascript、application/x-excel 和 application/octet-stream。
Content-Length: 表示後續數據消息的長度。
特殊路徑標識
HTTP 的標準定位有:表示網站根目錄(域名)的“/”、表示上級目錄的“…/”和表示當前目錄的“./”;而 ASP.NET 有獨特的符號:“~”,這是 ASP.NET 內部進行定義的推薦方法,但它並不會被瀏覽器認識,所以 ASP.NET 會將路徑轉化爲相對於網站的根目錄的全路徑再輸出到瀏覽器。
在使用 runat=“server” 的控件中使用 ~,會自動進行轉化;如果在 HTML 控件或代碼中轉化,需使用 VirtualPathUtility 類中靜態方法進行虛擬路徑、全路徑等的轉化,例如將虛擬路徑轉化爲對於根的全路徑:VirtualPathUtility.ToAbsolute("~/a/b.aspx")。
VirtualPathUtility 類中主要的方法有:
如路徑最後沒有 / 則添加:string AppendTrailingSlash(string virtualPath);
將兩個路徑進行合併:string Combine(string basePath, string relativePath);
返回虛擬路徑的目錄部分:string GetDirectory(string virtualPath);
計算兩個虛擬路徑的相對路徑:string MakeRelative(string fromPath, string toPath);
轉化爲絕對路徑:ToAbsolute。
Request 對象
Request 的主要方法:
Request.AppRelativeCurrentExecutionFilePath:獲取當前執行請求相對於應用根目錄的虛擬路徑,例如:~/Handler.ashx。
Request.PhysicalApplicationPath:獲取當前應用的物理路徑。
Request.PhysicalPath:獲取當前請求的物理路徑。
Request.RawUrl:獲取原始請求 URL,Request.Url 獲取請求的 Url,區別在 URL 重寫方面。
Request.UrlReferrer:獲取網頁來源。如果直接訪問圖片等資源 UrlReferrer 就是 null;如果是嵌入到別的網頁的請求,就是網頁的地址。
Request.UserHostAddress:獲取訪問者 IP 地址。
Request.UserLanguages:獲取訪問者瀏覽器支持的語言。
Request.Cookies:獲取瀏覽器發過來的瀏覽器端的 Cookie,寫回操作要用 Response.Cookies。
Request.MapPath(virtualPath):將虛擬路徑轉化爲物理路徑。
Response 對象
爲了提高服務器性能,ASP.NET 向瀏覽器 Write 時默認不會每一次都立即輸出,而是緩存數據,到合適時機或響應結束時纔將緩存區的數據一起發送到瀏覽器。
Response 的主要成員及方法:
Response.Buffer、Response.BufferOutput:這兩個屬性是一樣的,Buffer 內部調用了 BufferOutput;這個屬性能控制是否採用響應緩存,默認值是 true。
Response.Flush():將緩存區中的數據發送給瀏覽器。
Response.Clear():清空緩存區中的數據。
Response.ContentEnconding:輸出流的編碼。
Response.ContentType:輸出流的內容類型。例如:text/html、text/plain 和 image/JPEG。
Response.Cookies:返回給瀏覽器的 Cookie 集合,通過這個方法設置 Cookie。
Response.OutputStream:輸出流,在輸出圖片、Excel 文件等非文本信息時使用。
Response.End():終止響應,將緩存區中的數據發送給瀏覽器;End() 之後的代碼不會繼續執行。在終止一些非法請求時可以使用以此立即終止請求。
Response.Redirect(url):重定向瀏覽器到新的網址,即重定向到站外網址或站內網址。Redirect 會向瀏覽器發送 302。瀏覽器地址欄內容會發生改變。
Response.SetCookie(HttpCookie cookie):向輸出流中更新寫到瀏覽器中的 Cookie,如果不存在相應 Cookie 就新添加這個 Cookie;是對 Response.Cookies 的簡化調用。
Response.Write():向瀏覽器輸出內容。
Response.WriteFile(path):向瀏覽器輸出文件。
Server 對象
Server 是 context 的一個屬性,是 HttpServerUtility 類的一個對象。
Server.HtmlDecode()、Server.HtmlEncode()、Server.UrlEncode() 和 Server.UrlDecode() 是對 HttpUtility 類中方法的代理調用。
Server.Transfer(path):內部重定向請求。整個過程是服務器內部的接管,瀏覽器不參與過程,故瀏覽器地址欄內容不發生改變。Transfer 不能像 Redirect 一樣重定向到外部網站,且不能直接重定向到 ashx。
特殊情況時無法獲得 HttpContext 對象,例如在 Global.asax中,但可以通過 HttpContext.Current 獲得當前的 HttpContext,進而獲得 Request、Response 和 Server 等。
Server.MapPath(path):作用是返回與Web服務器上的指定虛擬路徑相對應的物理文件路徑。
HttpHandler
HttpHandler 是對請求的響應,既可以輸出 html 內容,也可以輸出圖片、文件(下載)。
當 HttpHandler 輸出是 html、txt 和 jpeg 等類型信息時,瀏覽器會直接顯示。
在添加 Header:後,可使瀏覽器彈出保存對話框:
string encodeFileName= HttpUtility.UrlEncode("xxx.txt");
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", encodeFileName));
filename 是編碼後的文件名,filename 段爲建議的保存文件名。
動態輸出的作用是不用再把資源保存到磁盤上再輸出(不會出現文件重名問題,因爲文件不在服務器端生成)。
Eg. 圖片下載
Download.html
!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<a href="Download.ashx">Download</a>
</body>
</html>
Download.ashx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace asp.net_test200409.HttpHandlerTest
{
/// <summary>
/// Download 的摘要說明
/// </summary>
public class Download : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/JPEG";
context.Response.AddHeader("Content-Disposition", "attachment:filename=downloadFilename.jpg");
context.Response.WriteFile("filename.jpg");
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
上述代碼在部分瀏覽器下並不能正確運行,在搜狗瀏覽器中不會彈出下載窗口,在 Internet Explorer 則會將下載圖片的文件名自動變更爲 ashx 的文件名,即 Download.jpg;Microsoft Edge 可正確運行。倘若想要將圖片以包含漢字方式下載,需加入下列代碼解決亂碼問題:
······
string filename = HttpUtility.UrlEncode("沒有亂碼了!.jpg");
context.Response.AddHeader("Content-Disposition", "attachment:filename=" + filename);
······