標籤:style blog http io ar color os 使用 sp
1.基本原理圖
IsReusable屬性用來表示在IHttpHandlerFactory對象建立IHttpHandler的時候是否能夠將這個Handler存入池中以便重用。
一般處理常式(HttpHandler):是一個實現System.Web.IHttpHandler介面的特殊類。任何一個實現了IHttpHandler介面的類,是作為一個外部請求的目標程式的前提。(凡是沒有實現此介面的類,就不能被瀏覽器請求。)
它由支援ASP.NET的伺服器調用和啟動運行。一個HttpHandler程式負責處理它所對應的一個或一組URL地址的訪問請求,並接收用戶端發出的訪問請求資訊(請求報文)和產生響應內容(響應報文)。
簡單的說:咱可以通過建立一個我們自己的HttpHandler程式來產生瀏覽器代碼發送回用戶端瀏覽器。
HttpHandler程式可以完成普通類程式所能完成的大多數任務:
1.擷取用戶端通過HTML的Form表單提交的資料和URL參數
2.建立對用戶端的響應訊息內容
3.訪問伺服器端的檔案系統
4.串連資料庫並開發基於資料庫的應用
5.調用其他類
2.生命週期:
請求管道的19個事件:
(1)BeginRequest: 開始處理請求
(2)AuthenticateRequest授權驗證請求,擷取使用者授權資訊
(3):PostAuthenticateRequest擷取成功
(4): AunthorizeRequest 授權,一般來檢查使用者是否獲得許可權
(5):PostAuthorizeRequest:獲得授權
(6):ResolveRequestCache:擷取頁面緩衝結果
(7):PostResolveRequestCache 已擷取緩衝 當前請求映射到MvcHandler(pr): 建立控制器工廠 ,建立控制器,調用action執行,
view→response
(8):PostMapRequestHandler 建立頁面對象:建立 最終處理當前http請求的 Handler 執行個體: 第一從HttpContext中擷取當前的PR Handler
,Create
(9):PostAcquireRequestState 擷取Session
(10)PostAcquireRequestState 獲得Session
(11)PreRequestHandlerExecute:準備執行頁面對象
執行頁面對象的ProcessRequest方法
(12)PostRequestHandlerExecute 執行完頁面對象了
(13)ReleaseRequestState 釋放請求狀態
(14)PostReleaseRequestState 已釋放請求狀態
(15)UpdateRequestCache 更新緩衝
(16)PostUpdateRequestCache 已更新緩衝
(17)LogRequest 日誌記錄
(18)PostLogRequest 已完成日誌
(19)EndRequest 完成、
3.一個小例子——前台實現使用者名稱的驗證
在說一般處理常式之前,先來看看什麼是aspx。在vs中,使用的大多是aspx頁面。aspx頁面就
是在接收到一個請求之後,將返回的結果產生一個html頁面返回給伺服器。當我們有時候需要自己來處理這個結果,而不是直接返回html的時候。怎麼做呢?這時候就需要一般處理常式了。一般處理常式就是這樣一個只有cs頁面,而沒有前台的檔案。副檔名為ashx。
執行個體驗證使用者名稱
JS<script type="text/javascript" >//驗證使用者名稱是否正確function JudgeUserName() { var username = $("#userName").val()$.ajax({type: "Post",url: ‘RegisterUserNameVerity.ashx/ProcessRequest?username=‘+username,success: function (result) {if (username == "") {alert("使用者名稱不可為空!");document.getElementById("userName").focus();document.getElementById("userName").selected;} else {if (result == "True") {alert("已存在,請您重新選擇一個使用者名稱!")document.getElementById("userName").focus;document.getElementById("userName").select();} } },});}</script>
Html
<input type="text" onblur="JudgeUserName()" />
一般處理常式
1 public void ProcessRequest(HttpContext context) 2 { 3 //擷取從前台傳過來 4 string userName = context.Server.UrlDecode(context.Request.QueryString["username"]); 5 //聲明查詢使用者名稱是否存在的對象 6 userBLL verifyusernamebll = new userBLL(); 7 //通過其他的函數來判斷 8 bool flag=verifyusernamebll.Exists(userName); 9 if (flag==true)10 {11 context.Response.Write(true);12 }13 else14 {15 context.Response.Write(false);16 }17 }一般處理常式
總結
這就是在前台直接可以不通過重新整理來進行對使用者名稱的校正,簡單的一個小demon。關於一般處理常式,關鍵的地方就是在前台如何來需要的值傳入到後台。這樣在只要在一般處理常式拿到了前台的值後,那麼操做起來就簡單的多了。這裡的值直接放在連結裡面傳過來的。
總結一下就三點:
1.傳值,調用一般處理常式
2.處理,將結果返回給前台
3.前台處理返回的結果
4.一般處理常式ashx調用Session的方法
如何在ashx頁面擷取Session值?
請注意以下描紅部分:
==========================
在一般交易處理頁面,可以輕鬆的得到 Request,Response對象,從而進行相應的操作,如下:
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
但是要得到 Session的值就沒有那麼簡單了。比如你要在ashx得到儲存在Session中的登入帳號Session["userAccount"]
如果你只是context.Session["userAccount"]的話是會報 “未將對象引用設定到對象的執行個體”的異常
所以,如果要想取Session中的值 ,需要如下所示
1、引入 命名空間:
using System.Web.SessionState;
2、實現IRequiresSessionState介面,具體如下
/// <summary>
/// $codebehindclassname$ 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class AddUserInfo : IHttpHandler,IRequiresSessionState //就是這樣顯示的實現一下,不用實現什麼方法
{
public void ProcessRequest(HttpContext context)
{
//...
//這樣你就可以如下 操作了
if(context.Session["userAccount"] != null)
{
string account = context.Session["userAccount"].ToString();
}
//...繼續下面的代碼
}
}
5.深入解釋一般處理常式運行過程
伺服器怎麼接收和發送資料?
在一般處理常式裡,通過ProcessRequest方法的參數HttpContext context調用
系統對象 作用
Page 指向頁面自身的方式。範圍為頁面執行期。
HttpRequest 讀取用戶端在Web請求期間發送的值(http請求報文資料)
HttpResponse 封裝了頁面執行期返回到HTTP用戶端的輸出(http響應報文資料)
HttpApplication 作用於整個程式運行期的狀態物件
Session 會話期狀態保持對象,用於跟蹤單一使用者的會話。
Cookie 用戶端保持會話資訊的一種方式
Server 提供對伺服器上的方法和屬性的訪問
Request(HttpRequest) & Response(HttpResponse)
一、瀏覽器提交資料方式?(例) get/post
1.表單:(資料藏在請求報文體中,格式:txtname=james&txtpwd=123) <form action=“login.ashx” method=“post”> <input type=“text” name=“txtname” /> <input type=“password” name=“txtpwd”/> </form>
2.地址欄的URL參數,超連結的url,js指定的url(和表單的Get方式一樣):索引值對http://127.0.0.1/login.ashx?txtname1=jordan&txtpwd1=123
二、伺服器如何擷取瀏覽器提交的資料?
1.擷取POST資料:context.Request.Form[“txtname”]
2.擷取GET參數:context.Request.QueryString[“txtname1”]
三、伺服器如何向瀏覽器輸出資料?
context.Response.Write(“我是從伺服器輸出到瀏覽器的資料!:)”);
Request(HttpRequest)常用成員
頁面間傳遞資料的幾種方式?(get/post : 超連結,location,js的submit(),表單提交按鈕)
入門1.html
<form action="入門1.ashx"> <input type="text" name="username" /><input type="submit" /> </form>
建立一個【一般處理常式】入門1.ashx, ProcessRequest中寫
context.Response.ContentType = "text/html";
string username = context.Request["username"];
context.Response.Write(username + "<font color=‘red‘>你好</font>"+Guid.NewGuid());//根據當前電腦的硬體編號+系統時間微秒數
每當使用者請求訪問ashx頁面的時候,ProcessRequest方法就會被調用,在這裡通過訪問context.Request獲得訪問者的請求參數等。然後在ProcessRequest中通過context.Response向瀏覽器發回資料給瀏覽器。ProcessRequest結束之時就是伺服器為這個瀏覽者本次訪問服務完成之時
瀏覽器向伺服器端提交資料,被提交資料的表單(input、select、textarea等)放到form中,form中通過action屬性設定表單被提交給哪個頁面,為了在服務端取出表單項的值,需要在HTML中為表單元素設定name屬性,注意id是給JS操作Dom用的,name才是提交給伺服器用的。在伺服器端用context.Request["username"]來根據表單項的name來獲得提交的屬性值。通過context.Response.Write向瀏覽器輸出處理後的顯示HTML內容。
當我們點擊【提交】按鈕以後是瀏覽器將使用者填寫的文字框等控制項中的值“提取”出來發送給伺服器,而不是伺服器來讀取使用者填寫的這個頁面。哪些標籤的哪些值會被提交給伺服器呢?將使用者填寫的內容提交到伺服器有如下幾個條件:
只能為 input、textarea、select三種類型的標籤。只有input(文字框、CheckBox等)使用者才可能填寫值,<label>、<p>、<font>等標籤僅供顯示用,沒有提交到伺服器的必要。
只有value屬性的值才會提交給伺服器。以input標籤為例,input標籤有title、type、disabled等屬性,但是這些屬性都是供顯示用的,使用者並不能修改,只有value屬性才是使用者輸入的屬性,因此只有value屬性的值才會被提交到伺服器。
標籤必須設定name屬性。學習Dom的時候我們知道如果要通過JavaScript操作標籤,必須為標籤設定Id。如果要將標籤的value屬性值提交到伺服器,則必須為標籤設定name屬性,提交到伺服器的時候將會以“name=value”的索引值對的方式提交給伺服器,多個索引值對之間用&分割。除了選項按鈕等少數標籤之外,大部分標籤的name的值不能重複。name是給伺服器用的,id是給Dom用的。對於RadioButton,同name的為一組,選中的RadioButton的value被提交到伺服器。
如果設定了控制項的disabled屬性的話,瀏覽器也不會提交該控制項的值。
放到form標籤內。只有放到form標籤內的標籤才可能會被提交到伺服器,form之外的input等標籤被忽略。
【.net項目中。。】.net一般處理常式使用方法