主頁(yè) > 知識(shí)庫(kù) > ASP.NET之自定義異步HTTP處理程序(圖文教程)

ASP.NET之自定義異步HTTP處理程序(圖文教程)

熱門(mén)標(biāo)簽:同安公安400電話怎么申請(qǐng)流程 玉林市機(jī)器人外呼系統(tǒng)哪家好 合肥電銷(xiāo)外呼系統(tǒng)哪家公司做的好 申請(qǐng)400電話手續(xù) 南陽(yáng)外呼系統(tǒng)定制化 預(yù)測(cè)式外呼系統(tǒng)使用說(shuō)明 百度ai地圖標(biāo)注 電話機(jī)器人軟件銷(xiāo)售工作 蘋(píng)果手機(jī)凱立德地圖標(biāo)注

一、前言

1.對(duì)讀者想說(shuō)的話:(可跳過(guò))

在此我感謝那些看了《ASP.NET之自定義同步HTTP處理程序》這篇文章以及看到了這篇《ASP.NET 之 自定義 異步HTTP處理程序》的親們。前面的那篇可能看過(guò)MSDN的親們一定會(huì)發(fā)現(xiàn)很多熟悉的地方。而我其實(shí)就是比較詳細(xì)的介紹了一下,讓大家更好的理解      

PS:MSDN從頭到尾都是文字且文字很統(tǒng)一,恐怕很多人都感覺(jué)畏懼,懶的去看,所以我將其重要的部分提取出來(lái),使用易懂的例子和簡(jiǎn)潔的語(yǔ)言來(lái)敘述。當(dāng)然其中也免不了錯(cuò)誤,希望各位親們可以指出。

2.正式的開(kāi)始

前面我們學(xué)習(xí)了關(guān)于關(guān)于自定義同步HTTP處理程序,相信大家可能感覺(jué)有所成就(大牛們可能會(huì)覺(jué)得so easy)。但是這種同步的機(jī)制只能對(duì)付客戶訪問(wèn)較少的情況或者數(shù)據(jù)處理量不大的情況(每次申請(qǐng)一個(gè)同步HTTP處理程序都會(huì)新建一個(gè)新的線程來(lái)處理,當(dāng)申請(qǐng)量很大時(shí),線程將會(huì)被堵塞,致使服務(wù)器性能低下,甚至宕機(jī))。而今天這篇文章就是解決同步HTTP處理程序的這個(gè)致命缺點(diǎn),有效的使用服務(wù)器的資源。

PS:異步(僅限在本文章下的情況): 簡(jiǎn)單來(lái)說(shuō)就是一部分操作在使用我們自己創(chuàng)建的線程,另一部分操作由操作系統(tǒng)調(diào)用自身的線程有條不紊的處理,這樣我們可以將簡(jiǎn)單的處理由我們自身的線程完成,而復(fù)雜的處理則交給系統(tǒng)管理的線程來(lái)處理。因?yàn)檫@些線程是系統(tǒng)管理的所以不會(huì)出現(xiàn)卡死的情況,系統(tǒng)內(nèi)部會(huì)自動(dòng)的管理。當(dāng)然系統(tǒng)會(huì)通過(guò)通知的方式告知我們的自己的線程該處理已經(jīng)完成,這樣我們就可以避免使用多線程技術(shù),卻難于管理的問(wèn)題。

以下為圖例:

二、注冊(cè)與綁定(雖然前一篇已經(jīng)講述過(guò),但是在這里仍然重新再講一次)

為什么要有這兩部呢?而且還是要注冊(cè)與綁定這兩個(gè)呢?

答案是 你只寫(xiě)一個(gè)類(lèi) vs是不可能知道你這個(gè)東西是干什么的,所以我們需要在 web.config 中注冊(cè)我們自定義的HTTP處理程序。而綁定則是讓iis知道我們這個(gè)站點(diǎn)中含有一個(gè)自定義的HTTP處理程序。(下面我將以 iis7 為例說(shuō)明如何綁定)

1.注冊(cè)

復(fù)制代碼 代碼如下:

configuration>
system.web>
httpHandlers>
add verb="*" path="!-- 這里寫(xiě)需要綁定的客戶端申請(qǐng)的頁(yè)面(*.smm,*.ffs,web1.ffe) -->" type="!-- 這里寫(xiě)處理程序的類(lèi)名 -->"
/httpHandlers>
/system.web>
/configuration>

以上需要自行編寫(xiě)的部分我都已使用注釋寫(xiě)好

2.綁定( iis7 )

1) 打開(kāi) iis7 -》 打開(kāi)  網(wǎng)站  節(jié)點(diǎn) -》 點(diǎn)擊你的網(wǎng)站的名稱(chēng)

2) 雙擊

3) 點(diǎn)擊

4)

5) 最后點(diǎn)擊 確定 這樣在 iis 中的綁定就完成了(后面的完整例子我將會(huì)以文字介紹該過(guò)程)

三、關(guān)于類(lèi)的實(shí)現(xiàn)

這里我們將要實(shí)現(xiàn)兩個(gè)接口的功能,下面我將分開(kāi)來(lái)闡述

1. IHttpAsyncHandler 接口

需實(shí)現(xiàn)方法以及屬性如下:

   IAsyncResult BeginProcessRequest( HttpContext context , AsyncCallback cb , Object extradata ) 
   啟動(dòng)對(duì)HTTP處理程序的異步調(diào)用

   參數(shù)說(shuō)明:
                        context : 該對(duì)象提供對(duì)用于向 HTTP 請(qǐng)求提供服務(wù)的內(nèi)部服務(wù)器對(duì)象(如 Request、Response、SessionServer)的引用。
                    cb : 當(dāng)異步操作完成后調(diào)用該委托告知我們操作已經(jīng)完成
                    extradata : 處理該請(qǐng)求所需的所有額外數(shù)據(jù)
  返回值:
                   返回有關(guān)進(jìn)程狀態(tài)的IAsyncResult (可以讓我們時(shí)刻查看異步調(diào)用中的當(dāng)前狀態(tài))

 void EndProcessRequest( IAsyncResult result )
 進(jìn)程結(jié)束時(shí)提供異步處理End方法


    參數(shù)說(shuō)明:
                          result : 有關(guān)進(jìn)程狀態(tài)的IAsyncResult(這里的result跟BeginProcessRequest返回的是同一個(gè)對(duì)象,只是內(nèi)部的屬性等等改變了)

注: 但是我們還要實(shí)現(xiàn)不在IHttpAsyncHandler接口中的一個(gè)屬性和一個(gè)方法,否則IIS會(huì)報(bào)錯(cuò)

bool IsRusable
表明是否使用池,只需要實(shí)現(xiàn)get,返回false表示不使用,返回true表示使用。

   void ProceessRequest( HttpContext context )
同步HTTP處理程序被調(diào)用的方法(這里并不會(huì)調(diào)用該方法,但是必須實(shí)現(xiàn))



  2. IAsyncResutl 接口

需實(shí)現(xiàn)方法以及屬性如下:

      Object AsyncState
  獲取用戶定義的對(duì)象(其實(shí)就是以上的 extradata 并且只要實(shí)現(xiàn)get )

  WaitHandler AsyncWaitHandle
  獲取用于等待異步操作完成的 WaitHandle (一般都是返回NULL 并且只要實(shí)現(xiàn)get )  bool CompletedSynchronously
  獲取異步操作是否同步完成的指示(一般都是返回false)  bool IsCompleted
  獲取異步操作是否已完成的指示

  四、實(shí)現(xiàn)該功能(iis7 / asp.net 4.0 / vs2010 / windows 7 64bit )

注: 1.新建空web項(xiàng)目,并添加 App_Code 文件夾,并部署在 iis 上

    2.在App_Code中新建一個(gè)類(lèi),命名為"AsyncRequestHandler.cs"(這里的命名不影響,但是類(lèi)名是關(guān)鍵)

    3.在 AsyncRequestHandler.cs 中引用 "System.Threading" 命名空間

下面我們將一步一步的學(xué)習(xí)實(shí)現(xiàn)這個(gè)功能,雖然只是一個(gè)很簡(jiǎn)單的例子,但是可以讓你在以后的開(kāi)發(fā)中更加靈活的運(yùn)用。

1.實(shí)現(xiàn) IHttpAsyncHandler 接口
代碼如下:

復(fù)制代碼 代碼如下:

public class AsyncHttpHandler : IHttpAsyncHandler
{
public AsyncHttpHandler()
{
//
//TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}

public bool IsReusable
{
get
{
return false; //表明不使用池
}
}

public void ProcessRequest(HttpContext context) //不調(diào)用 必須實(shí)現(xiàn)的方法
{
throw new InvalidOperationException();
}

/// summary>
/// 當(dāng)客戶申請(qǐng)時(shí)執(zhí)行的異步處理
/// /summary>
/// param name="context">包含httpresponse、httprequest、server對(duì)象/param>
/// param name="cb">回調(diào)函數(shù)/param>
/// param name="extradata">需要傳遞的參數(shù)/param>
/// returns>返回有關(guān)進(jìn)程的狀態(tài)信息/returns>
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extradata) // 必須實(shí)現(xiàn)的方法
{
context.Response.Write("p>AsyncHttpHandler/p>"); //向頁(yè)面中寫(xiě)入html表明是該信息來(lái)自何處
AsyncOperation op = new AsyncOperation(context, cb, extradata); //實(shí)例化實(shí)現(xiàn)了 IAsyncResult 接口的類(lèi)(主要實(shí)現(xiàn)異步處理的類(lèi))
op.StartAsyncWork(); //開(kāi)始異步處理
return op; //返回該對(duì)象
}

/// summary>
/// 當(dāng)BeginProcessRequest中的 return op;與異步的處理完成后調(diào)用(調(diào)用完既呈現(xiàn)頁(yè)面)
/// /summary>
/// param name="result">為op,但是屬性已改變/param>
public void EndProcessRequest(IAsyncResult result)
{
}
}

2.實(shí)現(xiàn) IAsyncResult 接口(與上面的代碼在同一個(gè)文件中)
代碼如下:
復(fù)制代碼 代碼如下:

public class AsyncOperation : IAsyncResult
{
HttpContext _context; //保存context的引用
AsyncCallback _cb;//保存回調(diào)委托的引用
object _state;//保存額外的信息
bool _iscomplate;//保存異步操作是否完成

/// summary>
/// 構(gòu)造函數(shù),將AsyncHttpHandler的參數(shù)全部傳遞進(jìn)來(lái)
/// /summary>
/// param name="context">/param>
/// param name="cb">/param> //該回調(diào)不可被重寫(xiě),否則將會(huì)出現(xiàn)客戶端永久等待的狀態(tài)
/// param name="state">/param> //構(gòu)造時(shí)該值可以傳遞任意自己需要的數(shù)據(jù)
public AsyncOperation(HttpContext context, AsyncCallback cb, object state)
{
_context = context;
_cb = cb;
_state = state;
_iscomplate = false; //表明當(dāng)前異步操作未完成
}

/// summary>
/// 實(shí)現(xiàn)獲得當(dāng)前異步處理的狀態(tài)
/// /summary>
bool IAsyncResult.IsCompleted
{
get
{
return _iscomplate;
}
}

/// summary>
/// 返回 false 即可
/// /summary>
bool IAsyncResult.CompletedSynchronously
{
get
{
return false;
}
}

/// summary>
/// 將返回額外的信息
/// /summary>
object IAsyncResult.AsyncState
{
get
{
return _state;
}
}

/// summary>
/// 為空
/// /summary>
WaitHandle IAsyncResult.AsyncWaitHandle
{
get
{
return null;
}
}

/// summary>
/// 表明開(kāi)始異步處理的主函數(shù)(方法名可以改,但上面的調(diào)用也需要一起改)
/// /summary>
public void StartAsyncWork()
{
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);//相信很多玩國(guó).net winform 開(kāi)發(fā)的一定認(rèn)識(shí)
}

/// summary>
/// 異步操作調(diào)用的方法
/// /summary>
/// param name="workstate">為QueueUserWorkItem方法中第二個(gè)參數(shù)傳遞的值/param>
public void StartAsyncTask(object workstate)
{
_context.Response.Write("p>Completion IsThreadPoolThread is" + Thread.CurrentThread.IsThreadPoolThread + "/p>");
_iscomplate = true; //表明異步操作已完成
_cb(this);//調(diào)用回調(diào)函數(shù)表明完成
}
}

3.web.config 配置

內(nèi)容如下(紅色方框部分為需要添加的內(nèi)容):

4.iis綁定(如何綁定見(jiàn) 二 )

5.測(cè)試

時(shí)你隨意的寫(xiě)  test.async 或者  asd.async 等等,最后呈現(xiàn)的頁(yè)面都是一致的。這樣就達(dá)到我們的效果了

五、看完這些只是淺層

這里我想指明的是看完這些并不代表你已經(jīng)掌握了所有,因?yàn)殛P(guān)于異步還有一個(gè)部分就是共享資源的使用,這個(gè)就需要使用到 WaitHandle 類(lèi),否則就會(huì)導(dǎo)致多個(gè)線程同時(shí)訪問(wèn)并修改同一個(gè)共享資源,后果可想而知。所以在這篇文章完結(jié)的同時(shí)也意味著新的問(wèn)題的開(kāi)始,所以我們要不斷的學(xué)習(xí)下去。

您可能感興趣的文章:
  • JQuery FlexiGrid的asp.net完美解決方案 dotNetFlexGrid-.Net原生的異步表格控件
  • asp.net下實(shí)現(xiàn)支持文件分塊多點(diǎn)異步上傳的 Web Services
  • jquery異步調(diào)用頁(yè)面后臺(tái)方法#8207;(asp.net)
  • asp.net+ajaxfileupload.js 實(shí)現(xiàn)文件異步上傳代碼分享
  • asp.net jquery+ajax異步刷新實(shí)現(xiàn)示例
  • Asp.net利用JQuery彈出層加載數(shù)據(jù)代碼
  • asp.net+jquery滾動(dòng)滾動(dòng)條加載數(shù)據(jù)的下拉控件
  • asp.net動(dòng)態(tài)加載用戶控件,關(guān)于后臺(tái)添加、修改的思考
  • asp.net 未能加載文件或程序集“XXX”或它的某一個(gè)依賴(lài)項(xiàng)。試圖加載格式不正確的程序。
  • asp.net下的異步加載

標(biāo)簽:南昌 揚(yáng)州 南京 南京 淄博 臺(tái)州 海南 嘉興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET之自定義異步HTTP處理程序(圖文教程)》,本文關(guān)鍵詞  ASP.NET,之,自定義,異步,HTTP,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ASP.NET之自定義異步HTTP處理程序(圖文教程)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于ASP.NET之自定義異步HTTP處理程序(圖文教程)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章