【.net項目中。。】.net一般處理常式使用方法

來源:互聯網
上載者:User

標籤: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一般處理常式使用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.