Asp.net筆記 一、Socket類 進行網路編程的類,可以在兩台電腦之間進行網路通訊 過程: 向伺服器發送指令: GET /index.html HTTP/1.1 Host:127.0.0.1:8080 回車空行 二、瀏覽器是什麼 瀏覽器就是一個Socket網路客戶端,幫助用戶請求網站伺服器上 ...
Asp.net筆記
一、Socket類
進行網路編程的類,可以在兩台電腦之間進行網路通訊
過程:
向伺服器發送指令:
GET /index.html HTTP/1.1
Host:127.0.0.1:8080
回車空行
二、瀏覽器是什麼
瀏覽器就是一個Socket網路客戶端,幫助用戶請求網站伺服器上的內容並且將返回的內容渲染為圖形化內容
瀏覽器的過程:
用戶在瀏覽器輸入網址,瀏覽器向DNS伺服器發出Socket請求,
伺服器把請求的內容返回給瀏覽器,
瀏覽器將內容進行解析並渲染繪製成頁面展現,
如果遇到img、css、js等文件就再次發送請求,伺服器返回數據,
繼續進行渲染,直到最終請求完成。
三、編寫網站伺服器
步驟:
1,使用Socket啟動監聽
Socket serverSocket = new Socket(SocketType.Stream,ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(IPAddress.Any,8080)); serverSocket.Listen(10);
2,調用Socket.Accept()阻塞等待用戶請求,當一個用戶請求過來後Accept()方法返回一個新的Socket對象
每個Socket代表一個連接通道
3,進行通信
四、靜態網站伺服器
伺服器路徑和請求為固定的頁面,請求的內容也是固定的
五、動態網站內容
在請求的時候寫上
/add?i=1&j=2 對i和j進行相加運算
?前面為處理程式路徑,?後面為請求的參數,以&分隔多個參數
六、請求處理響應
瀏覽器(收集用戶操作)——伺服器(對用戶請求進行處理)——瀏覽器(解析、顯示)
向伺服器發送請求 想瀏覽器返迴響應
伺服器不知道瀏覽器什麼時候關閉,他們之間是短暫的網路連接
除非瀏覽器請求,否則伺服器無法主動向瀏覽器發送數據!!!
七、Web伺服器和ASP.NET
web應用程式:一般處理程式
一般處理程式與html頁面聯繫起來靠<form action="XX.ashx"></form>
Web伺服器幫助處理靜態文件的請求;
對於動態內容,web伺服器幫著進行http層面的處理,具體請求由ASP.NET程式負責
八、一般處理程式
示例代碼:
context.Response.ContentType = "text/html"; string name = context.Request["name"]; context.Response.Write(name+"<font color='red'>你好"</font>);
過程:
每當用戶請求訪問ashx頁面的時候,ProcessRequest方法就會被調用,在這裡通過訪問context.Request獲得訪問者的請求參數。
然後在ProcessRequset中通過context.Response向瀏覽器發回數據
註意:
建立項目的時候選擇網站和webApplication的區別?
如何避免每次都手動輸入地址欄?
在屬性里設定定向網站
調試方式和非調試方式的不同用途:
調試可以設置斷點;
非調試方式啟動(項目停止運行後還可以訪問)可以修改
cs代碼重新生成就可以起作用,靜態文件的修改不需要重新生成
九、表單的提交
<form></form>表單元素中的有name屬性的input、select、textarea等的元素的value值會自動調教給伺服器
通過設定action屬性,來指定提交給哪個ashx程式
註意:name才是提交給伺服器用的,可以重覆
伺服器端用context.Request["username"];來根據表單項的name來獲得提交的屬性值
checkbox沒選中為null,選中為“on”
radiobutton,同name的為一組
當input=submit的時候,只有被點擊的按鈕(要有name)的value才會被提交
只有在form標簽內的標簽才可能被提交到伺服器,之外的會被忽略!!
十、favicon.ico請求
大部分瀏覽器的預設請求,如果網站伺服器的目錄下有這個文件,就會被拿來當做標簽的小圖標
收藏夾里也支持
十一、http協議
1,連接(Connection)
瀏覽器和伺服器之間傳輸數據的通道。
一般請求完畢就關閉,http不保持連接。
好處:可以提高併發請求的效率
缺點:因為建立連接的速度問題,(每次請求html文本和圖片是獨立的兩次連接)
降低的瀏覽器響應的速度
2,請求(Request)
瀏覽器向伺服器發送的“請求”信息,包含了請求的類型、數據和瀏覽器的信息(語言、瀏覽器版本等)
GET /請求的地址 HTTP/1.1 表示向伺服器用GET方式請求首頁,使用HTTP/1.1協議
User-Agent(簡稱UA) 為瀏覽器的版本信息。通過這個信息可以讀取瀏覽器是IE或者什麼
Referer 當前頁面的上一個頁面(來源、所屬頁面)
Accept-Encoding 伺服器支持什麼壓縮演算法。
Accept-Language 瀏覽器支持什麼語言
3,響應(Response)
伺服器對瀏覽器請求的返回的數據,包含是否成功、錯誤碼等。
瀏覽器不知道伺服器的處理過程,僅僅是拿到結果進行渲染輸出
響應碼舉例:
“200” : OK;
“302” : Found 暫時轉移,用於重定向, Response.Redirect()會讓瀏覽器再請求一次重定向的地址,
重定向的請求是Get方式;
"404" : Not Found 未找到。
500 伺服器錯誤(一般伺服器出現異常),通過報錯信息找出異常的點。
403: 客戶端訪問未被授權。
304 (伺服器把文件的修改日期通過Last-Modified返回給瀏覽器,瀏覽器緩存這個文件,
下次向伺服器請求這個文件的時候,通過If-Modified-Since問伺服器說“我本地的文件的修改日期是。。。”,
伺服器端如果發現文件還是那個文件,則告訴瀏覽器(304 Not Modified)文件沒修改,還用本地的吧。ctrl+f5)。
總結:2xx:沒問題;3xx代表瀏覽器需要乾點啥;4***瀏覽器的問題;5xx伺服器錯誤
4,處理(Process)
伺服器通過Content-Type告訴客戶端響應的數據的類型,方便給瀏覽器按照類型進行響應
text/html HTML樣式
text/plain 純文本樣式
十二、Get和Post
一個form預設有Method屬性,預設的value是Get
<form action="指向的ashx程式" method="get或者post"></form>
get(預設值)是通過URL傳遞表單值,post傳遞的表單值是隱藏到http報文體中,url看不到
(get會直接將提交的內容顯示到地址欄,post不會)
兩者的區別:
1,get通過url傳遞,在地址欄能夠看到值,post是通過報文體不會顯示到地址欄
2,get傳遞的數據量是有限的,post沒有限制
3,get方式的結果頁面可以轉發給另一個瀏覽器直接讀取,post不行(另一個角度的安全性)
註意:
只要在地址欄中輸入一個網址回車訪問,那麼就是GET方式。
數據格式:
伺服器文件名後跟著“?”,由於客戶端可能向伺服器端提交多個鍵值對,鍵值對之間用“&”進行分隔
如果URL中有漢字、特殊符號等,則需要對URL進行編碼
十三、HttpContext
和本次請求相關對象的一個上下文對象,一般通過它去操作其它對象。
如果在一般處理程式的ProcessRequest方法中,可以通過方法的context參數獲得對象。
在其他地方可以通過,HttpContext.Current拿到當前請求堆棧中的HttpContext對象
(不建議,如果涉及到多線程,會無法獲得。)
十四、HttpRequest
請求的相關信息
context.Request.Form["username"];獲取Post請求中的值
context.Request.QueryString["username"];獲取get輕輕中的值
context.Request["username"];
順序著從QueryString、Form、Cookies、ServerVariable中找,第一個找到的就是
地址欄中的 name=rupeng&age=8 叫做QueryString
註意:
請求參數返回的都是String類型數據,因為Http協議本身就是文本
十五、HttpResponse
響應相關信息
ContentType 設置響應的類型
context.Response.ContentType = "text/html";
OutputStream輸出流
context.Response.End(); 停止輸出,本質是個異常,只是被freamwork給catch了
Redirect();重定向
向瀏覽器返回302重定向,是通知瀏覽器重新訪問新網址,所以在地址欄中可以看到變化
十六、context.Server
Server是一個HttpServerUtility類型的對象,不是一個類名
context.server.MapPath("~/a.html"); 將虛擬路徑(~代表項目根目錄)轉換為磁碟上的絕對路徑,
(操作項目中的文件使用)
HtmlEncode、HttpDecode
HTML編碼與解碼
示例代碼:
List<T> list = new List<T>(); 想在html中顯示就要對“<>”進行轉義
< less than
> great than
context.server.htmlencode("List<T> list = new List<T>()");可以直接進行轉義
UrlEncode、UrlDecode
url編碼與解碼
方式同上!!
十七、無狀態的HTTP
HTTP協議都是無狀態的:
無法保存上次和伺服器交互的內容:每次HTTP請求到達aspnet都是創建一個新的HTTPhandler對象,來進行處理
實現“記住上次操作”的方法:
傳遞給瀏覽器一個值,讓瀏覽器下次提交時上傳這個值,來進行判斷;
如果要知道上一次的狀態:
一個方法是在對瀏覽器響應結束之前將狀態信息保存到頁面表單中,
下次頁面再向伺服器發出請求的時候帶上這些狀態信息,
這樣伺服器就能根據這些狀態信息還原上次的狀態了,類似於去看病的病歷本。
十八、Cookie
Cookie是和站點相關的:
每次想伺服器請求的時候,除了發送表單參數之外,還會將和站點相關的所有Cookie都提交給伺服器
Cookie保存在瀏覽器端
如果不設定Expires(Cookie 的聲明周期),則關閉瀏覽器,Cookie就失效
Cookie的缺點:
不能存儲太多內容——大小限制
機密信息不能存——保存在瀏覽器端,容易被作假
不希望丟失的數據不能存——可以被清除
不能跨瀏覽器使用——每個瀏覽器的Cookie是獨立的
Cookie的Path: 將Cookie設置在哪個路徑下
如果沒有設置,當前路徑和子文件夾都可以讀取
如果要整個功能變數名稱都可以訪問,則要設置為“/”(根目錄),
如果沒有設置,瀏覽器預設設置,(原理:反編譯HttpCookie可以看出)
Cookie無法跨功能變數名稱讀寫
子功能變數名稱之間預設無法操作,需要操作則設置Domain為父功能變數名稱:
www.rupeng.com 與 bbs.rupeng.com 需要設置Domain為".rupeng.com"
Domain=功能變數名稱
十九、Session(會話)
保存在伺服器端,保存和當前客戶端相關的數據
有自動銷毀機制,一段時間內瀏覽器沒有和伺服器發生交互,就會銷毀(為什麼一段時間沒有操作,賬戶會推出)
修改Session生命周期的方法:
在web.config的System.web節點下配置sessionState節點的timeout,
單位是分鐘,預設是20(只是建議值,在設定範圍內有可能會被伺服器以“壓力”為理由清理掉)
Cookie和Session的區別:
Cookie是保存在瀏覽器的,Session是保存在伺服器的
通過Http報文發現:Cookie中放了一個SessionId,伺服器中保存SessionId和數據的對應關係
(鍵值對的關係,瀏覽器的Cookie有記錄當前的Session的Id,伺服器接收到到這個Id的時候會在伺服器上查找到對應的Session,並按照Session中的數據進行操作)
兩者的作用的是一樣的:
都是保存和當前客戶端相關的數據,都存在生命周期
Guid演算法:
根據網卡mac地址、系統時間、Cpu時鐘周期等算出來的值,
這個值在同一臺電腦上多次調用都不會重覆,不同電腦同一時間也不重覆
可以保證“全球唯一”
調用方法:
Guid.NewGuid();
在伺服器中生成Guid(SessionId)到Cookie中,
然後在伺服器中建立一個以Guid為文件名的文件,文件內容為session的值
二十、進程外Session
因為Session預設是保存在伺服器記憶體中的(InProc),當伺服器重啟之後,Session就會銷毀,就會造成用戶反覆登錄的問題!
解決方法:
將Session保存在資料庫中,伺服器在重瀏覽器拿到SessionId後去伺服器查找Session的內容
相關要點:
需要進行“序列化”和“反序列化”
好處:
解決伺服器重啟的問題,有利於“伺服器集群”技術的實現
二十一、ASP.NET WEBFORM 最佳模式
最佳模式:
把aspx當成模板引擎,輕量使用WebForm控制項
二十二、Aspx(新建-web窗體)
在aspx中可以使用<%=表達式%>的方式在頁面的相應位置輸出表達式或者局部變數
該表達式至少要用protected級別,表達式也可以是一個方法、屬性或者欄位
註意:
如果自動提示出不來,重新生成項目即可
不要漏寫“=”,通過反編譯,“=”相當於Response.Write()
可以直接寫成<%Response.Write(表達式)%>
頁面中,除了<%%>的內容和runat=server的內容,其它都是原樣輸出
二十三、aspx和ashx的關係
aspx就是一個特殊的一般處理程式(ashx,IHttpHandler):
aspx對應的類是Page,它實現了IHttpHandler介面,所以可以說aspx是高級的HttpHandler
aspx封裝了很多操作
ashx對應handler類、aspx對應page類
二十四、aspx文件和aspx.cs文件和Designer.cs文件的關係
aspx(web窗體)文件相當於一個html模板,在編譯的時候生成和aspx.cs文件中的類的子類,會編譯生成普通的.net代碼,在代碼中拼接生成html
aspx.cs文件中的類和aspx.Designer.cs文件中的類都是部分類,同一個類名,
其中Designer.cs文件中保存頁面文件(aspx文件中涉及到的控制項的屬性,比如按鈕控制項的變數名等,所以必須是protected或者public級別)
二十五、runat=server的html控制項
不加就是普通的字元串,
加上就會生成對應的控制項對象
二十六、ASP.net服務端基本控制項
1,Button控制項
OnClientClick屬性,點擊按鈕是在瀏覽器端執行的代碼
是字元串屬性,寫的代碼是JavaScript代碼,渲染成onclick;
運行在瀏覽器端
示例代碼:
<asp:button ID="btnDel" runat="server" onclientclck="return confirm('真的要刪除嗎?')" Text="刪除" />
2,LinkButon控制項
和Button用法一致,區別是渲染成一個超鏈接
3,FileUpload控制項
會自動在form中加上 enctype="nultipart/form-data"
二十七、IsPostBack
從客戶端瀏覽器把之前的狀態數據“提交回來”(PostBack)
使用場景:
if(!IsPostBack)//表示當前是第一次打開頁面進行數據載入,進行數據載入
{
數據載入;
//第一次打開頁面的時候,進行數據載入
}
二十八、列表控制項綁定
對象.DataSource = DataTable或者集合;//數據填充
對象.DataBind();//數據綁定
註意:
DataBind前一般要判斷IsPostBack
二十九、Repeater
相當於一個高級的foreach迴圈,每一項的顯示用ItemTemplate格式去顯示
示例代碼:
<asp:Repeater ID="Repeter1" runat="server"> <ItemTemplate> <tr> <td><%#Eval("Name")%></td> <td><%#Eval("Age")%></td> <td><%#Eval("Gender")%></td> </tr> </ItemTemplate> </asp:Repeater>
下麵幾個的區別是什麼?
<%=test()%> 在當前位置調用test()方法,並將返回值顯示到此處。相當於:Response.Write(test())
<%test()%> 在當前位置調用test()方法,有沒有返回值顯示到此處取決於方法有沒有返回值
<%#Eval("id")%> 數據綁定,取id的值,替換到當前位置
三十、ViewState
伺服器放在瀏覽器的“數據緩存”機制,把Http模擬成了有狀態
在aspx的html頁面生成一個_viewstate隱藏欄位,每次頁面渲染生成html的時候,
asp.net把viewstate中的值進行編碼處理序列化為_viewstate這樣一個隱藏欄位放到html中
下次再提交的時候把_viewstate提交,伺服器把其反序列化填充到ViewState屬性中。
其實就是把瀏覽器端當成一個“數據暫存”場所。
為什麼不能把機密數據方法放在viewstate中?
因為其實保存在瀏覽器端的,會被造假!!
ViewState的壞處:
會在html中生成一堆雜亂的代碼,數據量很大的時候影響伺服器性能!!
怎麼禁用ViewState?
頁面中:EnableViewState="false";此時客戶端只會保留基本的_ViewState
全站禁用:
在Web.Config配置文件中的System.web下<pages enableViewState="false"/>
完全禁用:
去掉form的runat=server;
缺點:大部分伺服器控制項也用不了了!
什麼時候可以適合禁用:
當數據不需要“下次”使用的時候(不是只有設置,而是有讀取控制項的值的時候),就可以禁用
三十一、AJAX簡介
AJAX是一種進行頁面局部非同步刷新的技術。其實就是利用JavaScript創建XMLHTTPRequest對象,
調用一般處理程式,返回處理後的數據,再用JavaScript生成html代碼,就形成“局部刷新”的效果。
用AJAX向伺服器發送請求和獲得伺服器返回的數據並且更新到界面中,不是整個頁面刷新,而是在HTML頁面中使用JavaScript創建XMLHTTPRequest(簡稱XHR)對象,來向伺服器發出請求以及獲得返回的數據,
由於是在頁面中由XMLHTTPRequest來發出Http請求和獲得伺服器的返回數據,這樣頁面就不會刷新了。
XMLHTTPRequest是AJAX的核心對象。
名詞解釋:
局部:
頁面中的一小部分,不是全部一起刷新
非同步:
網路請求期間,瀏覽器不卡;
設置為非同步的時候,代碼會繼續執行,不會停下來等返回結果,叫做“非同步”
三十二、XMLHTTPRequest對象,AJAX的使用
開發一個AJAX功能需要開發服務端(ashx程式,伺服器端進行處理)和客戶端(javascript進行AJAX程式)兩塊程式。
AJAX請求原生DOM代碼:
//創建XMLHTTPRequest對象,三元表達式的目的是相容舊版本的瀏覽器,必寫 var xmlhttp = window.XMLHTTPRequest?new XMLHTTPRequest():new ActiveXObject("Microsoft.XMLHTTP"); //準備向伺服器的一般處理程式發出Post請求,(GET方式有緩存的問題,所以第一個參數為“POST”) xmlhttp.open("POST","AJAXTest1.ashx?i=5&j=10",true);//true:非同步模式;false:同步模式 //監聽xmlhttp的readystatechange事件 xmlhttp.onreadystatechange=function(){ //readyState==4,表示伺服器返回完成。1代表開始,2代表 if(xmlhttp.readyState == 4){ //狀態碼200代表成功 if(xmlhttp.status == 200){ alert(xmlhttp.responseText); } else{ alert("AJAX伺服器返回錯誤!"); } } } xmlhttp.send();//發送請求,發出請求後不等伺服器返回數據,代碼繼續向下執行,所以不會發生阻塞,不會“卡”
//簡單的AJAX封裝代碼
function ajax(url,onsucess,onfail){ var xmlhttp = window.XMLHTTPRequest?new XMLHTTPRequest():new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST",url,true); xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState==4){ if(xmlhttp.status==200){ onsucess(xmlhttp.responseText); } else{ onfail(xmlhttp.status); } } } xmlhttp.send(); }
三十三、Json
Json就是javascript對象或者數組格式的字元串,Http協議不能傳遞JavaScript對象,所以需要轉換為字元串進行傳輸,需要JSON
Json(一個標準,規定了對象以什麼樣的數據格式保存為一個字元串)將複雜對象序列化為一個字元串,在瀏覽器端再講字元串反序列化為JavaScript可以讀取的對象。
示例代碼:
JavaScript對象: var persons = {name:'rupeng',age:8}; JavaScript數組: var names = ['rupeng','baidu','qq']; JavaScript對象數組: var persons = [{name:'rupeng',age:18},{name:'baidu',age:1},{name='qq',age:19}];
三十四、Json的轉換
json字元串轉換為js對象:使用eval()函數,
eval()函數不安全?
因為是動態執行解析代碼,存在風險漏洞
var obj = eval("a("+data+")");
示例代碼:
1,在JavaScript中的Json對象的轉換過程:
var persons = [{name:'rupeng',age:19},{name:'baidu',age:17},{name:'taobao',age:10}];//定義JS中的一個對象數組 //json就是一種格式,在js中將JS中的對象按照字元串的形式進行封裝 var jsonPsersons = "[{name:'rupeng',age:19},{name:'baidu',age:17},{name:'taobao',age:10}]"; //使用eval()函數將json字元串轉換回js對象或者對象數組 var personsOut = eval("("+persons+")");//將json字元串加上小括弧,傳遞給eval函數,就得到了js對象 //輸出這個對象數組 for(var i = 0;i<personsOut.length;i++){ alert(personsOut[i].name+"="+personsOut[i].age); }
2,在C#中 .NET對象序列化為Json字元串的方法:
第一步,將,.NET對象序列化,轉化為Json字元串
第二步,將Json字元串轉化為js對象,進行處理
示例代碼:
第一步:
string strs = {"rupeng.com","baidu.com","taobao.com"};//字元串對象 JavaScriptSerializer jss = new JavaScriptSerializer();//創建序列化器的對象 string json = jss.Serialize(strs);//進行序列化 context.Response.Write(json);//將序列化後的json字元串返回給瀏覽器
第二步,在html文件中,對json字元串進行解析,執行JS操作
<script type="text/javascript"> ajax("JsonTest2.ashx", function (data) { var strs = eval("("+data+")"); for (var i = 0; i < strs.length; i++) { alert(strs[i]); } }, function () { alert("錯誤"); }) </script>
三十五、JQuery封裝的AJAX
示例代碼:
$.ajax({ type:"post",url:"一般處理程式.ashx", success:function(data){ alert(data);}, error:function(){alert("錯誤");} });
ajax方法的參數就是一個字典,
最好設定post提交,data為提交的報文體,
success為請求成功的處理事件,
error為請求通訊失敗的處理事件(伺服器錯誤,404等)
三十六、JQuery AJAX Json處理
可以使用$.parseJSON()方法,把json字元串解析為JavaScript對象,比eval()方法安全
如果設定ajax請求的ContextType為“application/json”或者ajax請求中設定datatype:"json",
那麼success的第一個參數就是JavaScript對象,不用手動去解析了
代碼示例:
$.ajax({ type:"post",datatype:"json", data:{i1:$("#txt1").val(),i2:$("#txt2").val()}, success:function(){}, error:function(){alert("錯誤");} });
ajax的業務錯誤處理:
error事件時通訊錯誤、伺服器錯誤等。
表單序列化:(在form場景下,如果表單很多,可以使用序列化的方式,如果不是form方式則不需要考慮)
如果表單元素放到了form中,並且按照http的標準(設置了name屬性),
那麼使用$("#form1").serializeArray()方法,就可以得到一個鍵值對數組,
把這個值賦值給$.ajax的data屬性。
實現了整個form表單的元素的序列化,ajax數據處理
全局事件:
1,全局Loading的顯示()
示例代碼:
$(function(){ $("body").bind("ajaxSend",function(){ //在Loading時候的代碼,比如一個loading圖片(設置是否為hidden) }).bind("ajaxComplete",function(){ //隱藏loading }); $.ajax({type:"post",url:"目標.ashx", success:function(data){ //通訊成功時執行的代碼 }, error:function(){ alert("通訊出錯"); } }); });
2,ajaxError全局錯誤處理
代碼示例同上。
三十七、ServerPush、Global文件的作用、Url重寫的好處及如何實現、ASP.NET緩存的作用、母版頁是什麼、SHTML是什麼
只有瀏覽器請求服務端,服務端才有給瀏覽器響應數據,不會主動向瀏覽器推送數據,
好處:安全、提高伺服器性能
1,ServerPush:模擬實現,伺服器向瀏覽器主動發送數據,
其本質就是:
長連接,瀏覽器在跟伺服器連接後,獲取數據後,繼續發送請求,一旦有新數據就會立刻返回,貌似主動推送。
其實就是:
while(true)
{
//瀏覽器請求數據
}
借用資料庫,進行數據查詢,伺服器程式對資料庫進行不斷的查詢,一旦獲得數據就返回給瀏覽器,瀏覽器端在獲得ajax返回數據後,繼續向伺服器程式發出請求
2,Global文件的作用
項目中右鍵添加新建項——全局應用程式類(不能改名字)
其中的方法是對應的各個部分啟動時開始調用該方法
重點方法:
Application_Start、 程式啟動時
Application_BeginRequest、 開始請求時
Application_Error。 程式出錯時
3,Url重寫
發生在伺服器端的url地址重新請求過程,可以配置在Application_BeginRequest、開始請求時進行請求地址的重新定向,達到“轉向”的效果
使用場景:
protected void Application_BeginRequest(object sender, EventArgs e) { //即使用戶訪問一個不存在的頁面,那麼Application_BeginRequest也會被調用 File.AppendAllText("d:\\1.txt", DateTime.Now + "Application_BeginRequest:"+ Context.Request.RawUrl + "\r\n"); //Context.RewritePath("WebExcel.html");//請求重寫在伺服器內部發生 //File.AppendAllText("d:\\1.txt", DateTime.Now + "Context.Request.Path:" + //Context.Request.Path + "\r\n"); int? count =(int?)Application.Get("Count"); if (count == null) { count = 1; } count++; Application.Lock(); Application.Set("Count", count); Application.UnLock(); //Url重寫:UrlRewrite。ViewPerson-1.aspx Match match = Regex.Match(Context.Request.Path, @"^/ViewPerson\-(\d+)\.aspx$"); if (match.Success) { string id = match.Groups[1].Value; Context.RewritePath("/ViewPerson.aspx?id="+id); } }
4,Application
是應用全局對象,被全體共用,操作之前先Lock,操作完unLock
示例代碼:
Application.Lock();//先自己鎖上,開始進行操作 Application.set("name","zhangsan");//設置值 Application.unLock();//解鎖,釋放 //////////// Application.Get("name");//另一個地方,可以去取值
5,ASP.NET緩存
作用:通過緩存,降低伺服器的壓力(不用每次都去執行查詢,)
缺點:
1,因為緩存是保存在記憶體中的,在伺服器重啟後會失效,
2,存在緩存有效期內數據發生變化,會導致數據不能及時更新。因此,設置合適的緩存時間和在什麼地方使用緩存,很重要
示例代碼:
//Cache是全局共用的,任何一個Session都可以拿到這個Cache DataTable dt = (DataTable)HttpRuntime.Cache["persons"]; if (dt == null)//如果Cache中沒有,再去資料庫中查詢 //這樣可以降低資料庫伺服器的壓力 { dt = SqlHelper.ExecuteQuery("select * from T_Persons"); //存儲緩存,30秒後過期 HttpRuntime.Cache.Insert("persons", dt, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero); } Repeater1.DataSource = dt; Repeater1.DataBind();
6,母版頁
aspx的模板文件,右鍵添加“母版頁”,名字隨意(文件名.master)
網頁很多地方長得一樣,也有不一樣的地方
Webform的母版頁(MasterPage),使用母版頁的窗體。母版頁太笨重。
母版頁使用ContentPlaceHolder挖坑,“使用母版頁的窗體”用Content填坑
7,SHTML是什麼
ServerSideInclude(SSI),主流web伺服器(iis、apache等)都支持。
效率高,不需要經過asp.net處理,輕量級。
代碼示例:
<!--#include file="head.html"--> 222222222222222222222222222222222222 <!--#include file="foot.html"-->
三十八、Razor模板引擎
建立方法:
新建一個.cshtml文件
語法使用:
在cshtml文件中使用@後面跟表達式,表示在這個文字輸出表達式的值,
模板中Model為伺服器程式處理後傳遞給模板的對象。
@{}中為C#代碼,C#代碼可以和html代碼混排
使用方法:
1,新建一般處理程式,
2,通過context.server.MapPath()方法,取得.cshtml文件的路徑
3,使用File.ReadAllText()方法,讀取.cshtml文件的內容
4,調用Razor.Parse()方法進行.cshtml文件的動態編譯,//Razor.Parse(cshtml,model,"編譯的程式集名字"),這樣可以避免重覆編譯,減輕伺服器負擔
5,使用context.Response.Write()方法將編譯後的.cshtml文件輸出
註意:
瀏覽器端是查看.ashx文件
示例代碼:
string fullPath = context.server.MapPath("~/RazorDemo/Razor1.cshtml"); string cshtml = File.ReadAllText(fullPath); string html = Razor.parse(cshtml); context.Response.Write(html);
三十九、Razor調用外部方法
編寫一個靜態方法,方法返回RawString類型,在.cshtml文件中就可以調用方法進行原樣輸出
在CSHTML中@表達式後面輸出的會自動進行HttpEncodedString
HttpEncodedString 進行Http編碼後輸出
RawString 進行原樣輸出
四十、Razor使用常見問題
1,“無法確定使用哪一版本的ASP.NET Web Pages”
在web.config文件<configuration>節點下添加
<appSettings> <add key="webPages:Version" value="2.0"/> </appSettings>
2,model如果傳遞對象的時候,如果只是傳遞普通的匿名類對象還可以(ASP.NET MVC 中都不可以)
如果傳遞集合就不可以,因為匿名類是internal的。最好傳遞命名對象。
如果非要傳遞匿名對象,可以使用newton.json(json.net)最新版9,先序列化為json,再反序列化為dynamic對象
註意:
取的對象不是原始數據類型了,因此要用foreach遍歷,且不能顯示轉換,
cshtml使用的時候都用dynamic,cshtml頁面頂部要加上@model dynamic(註意大小寫)
示例代碼:
//序列化方法: static dynamic ToDynamic(object obj) { string json = JsonConvert.SerializeObject(obj); dynamic dyObj = JsonConvert.DeserializeObject(json); return dyObj; }
3,關於在VS2015中使用的說明
需要適合2015版本的Razor模板引擎,會出現錯誤