ASP.NET 基礎

個人學習筆記。
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);

······
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章