ASP.NET之自定義同步HTTP處理程序(圖文教程)
一、前言
說(shuō)來(lái)這片簡(jiǎn)單的教程還真是碰巧,是剛好我在寫(xiě)另一個(gè)頁(yè)指令的時(shí)候看到的。就跟著進(jìn)來(lái)看了看是什么東西,發(fā)現(xiàn)比我們之前只會(huì)用.ashx,并且只能在申請(qǐng)這個(gè)文件才可以進(jìn)行響應(yīng)。這些似乎讓它變不靈活,不能讓我們靈活的應(yīng)用。而自定義HTTP處理程序可以完全消除上面的問(wèn)題,它只是一個(gè).cs的類(lèi)文件,并且你只要按照很簡(jiǎn)單的準(zhǔn)備工作就可以獲得很多的靈活度:
1.可以自定義用戶(hù)訪(fǎng)問(wèn)何網(wǎng)頁(yè)時(shí)響應(yīng)該文件并把數(shù)據(jù)呈現(xiàn)發(fā)送給客戶(hù)端
2.可以對(duì)所有具有一致的后綴名的請(qǐng)求文件定義一個(gè)處理程序
3.具有同步與異步選擇
我相信一定有人對(duì)于上面的說(shuō)有一定不的理解,這里我需要解釋它的一個(gè)重要意義,那么大家就自然知道它的靈活所在了。
我們先舉例:
1.比如你訪(fǎng)問(wèn) http://www.****.com/web1.msll
你一定發(fā)現(xiàn)了問(wèn)題所在.后綴名是 .msll 你瀏覽網(wǎng)頁(yè)到如今一定沒(méi)有見(jiàn)過(guò)。而這個(gè)的確就是自定義HTTP處理程序的一個(gè)特點(diǎn)所在,后綴名可以自己偽造。這個(gè)時(shí)候你一定會(huì)認(rèn)為 web1 是那個(gè) .cs 文件的名稱(chēng),但是結(jié)果是 web1 根本不是那個(gè) .cs 文件的文件名.他們是通過(guò)綁定來(lái)實(shí)現(xiàn)的。比如我實(shí)現(xiàn)了一個(gè) he.cs 的類(lèi),然后我將其綁定到 hehehe.ppd 那么當(dāng)你訪(fǎng)問(wèn) http://www.*****.com/hehehe.ppd 那么響應(yīng)這個(gè)頁(yè)面的是 he.cs 的輸出結(jié)果
2.我們還是假設(shè)你訪(fǎng)問(wèn) http://www.****.com/list1.ssm
http://www.****.com/list2.ssm
http://www.****.com/list3.ssm
假如我告訴你這個(gè)三個(gè)看似不同的頁(yè)面其實(shí)都是一個(gè) HTTP處理程序的輸出結(jié)果,這個(gè)其實(shí)很好理解,如果我寫(xiě)了一個(gè) bbsss.cs 的類(lèi),并且實(shí)現(xiàn)了有關(guān)功能。然后我將其綁定到 *.ssm 你可以發(fā)現(xiàn)這里是 *.ssm 這個(gè)時(shí)候你就按照你正常的思考,就是只要是對(duì)后綴名是 .ssm 頁(yè)面的申請(qǐng)都是使用同一個(gè) bbsss.cs 類(lèi),這下是不是有趣了
二、注冊(cè)與綁定
為什么要有這兩部呢?而且還是要注冊(cè)與綁定這兩個(gè)呢?
答案是 你只寫(xiě)一個(gè)類(lèi) vs是不可能知道你這個(gè)東西是干什么的,所以我們需要在 web.config 中注冊(cè)我們自定義的HTTP處理程序。而綁定則是讓iis知道我們這個(gè)站點(diǎn)中含有一個(gè)自定義的HTTP處理程序。(下面我將以 iis7 為例說(shuō)明如何綁定)
1.注冊(cè)
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="<!-- 這里寫(xiě)需要綁定的客戶(hù)端申請(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)注意點(diǎn)
雖然我們介紹完了注冊(cè)與綁定,但還不是所有,關(guān)于類(lèi)的實(shí)現(xiàn)也有一定的要求。根據(jù)MSDN文檔的說(shuō)明必須實(shí)現(xiàn) ProcessRequest 方法與 IsReusable 屬性
關(guān)于 ProcessRequest 可以暫時(shí)理解為 Page_Load (即使他比Page_Load更底層)
其次就是沒(méi)有內(nèi)置的 Request 與 Response ,可能有些人要崩潰了那怎么寫(xiě)啊,很簡(jiǎn)單的問(wèn)題沒(méi)有內(nèi)置我們就自己去定義
IsReusable 的類(lèi)型是 bool 類(lèi)型,而且只要實(shí)現(xiàn) get 不需要實(shí)現(xiàn) set ,如果返回 true 表示使用線(xiàn)程池 如果為 false 表示不使用
關(guān)于這個(gè)類(lèi)文件的放置也有要求,要放在App_Code 文件夾下(vs的站點(diǎn)中可以直接新建這個(gè)特殊的文件夾)
四、完整的例子(自行新建類(lèi))
1.
以下為 HelloWorldHandler.cs 類(lèi)的具體實(shí)現(xiàn)(放置在 App_Code 文件夾下)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
///HelloWorldHandler 的摘要說(shuō)明
/// </summary>
public class HelloWorldHandler : IHttpHandler
{
public HelloWorldHandler()
{
}
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<h1>hello</h1>");
Response.Write("</body>");
Response.Write("</html>");
}
public bool IsReusable
{
get
{
return false;
}
}
}
2.以下為 web.config 的內(nèi)容
<httpHandlers>
<add verb="*" path="*.sample" type="HelloWorldHandler" />
</httpHandlers>
3.IIS 配置(不要忘記把項(xiàng)目部署到 iis 中)
以下為具體配置

然后測(cè)試 http://localhost/SampleApplication/test.sample(端口為 80 時(shí))
你就可以看到你的成果了
五、完結(jié)
到此你已經(jīng)基本掌握了 自定義同步HTTP處理程序 ,當(dāng)然這個(gè)只是一小部分,后面我們還會(huì)接觸到異步,因?yàn)橥皆谟脩?hù)訪(fǎng)問(wèn)量很大的情況下將會(huì)使服務(wù)器資源迅速耗盡,而且也會(huì)讓降低用戶(hù)的實(shí)用性
相關(guān)文章
SQL為查詢(xún)的結(jié)果加上序號(hào)(ROW_NUMBER) 合并多個(gè)查詢(xún)結(jié)果
SQL為查詢(xún)的結(jié)果加上序號(hào)(ROW_NUMBER) 合并多個(gè)查詢(xún)結(jié)果2010-03-03
.NET?Core利用?AsyncLocal?實(shí)現(xiàn)共享變量的代碼詳解
在Web?應(yīng)用程序中,我們經(jīng)常會(huì)遇到這樣的場(chǎng)景,如用戶(hù)信息,租戶(hù)信息本次的請(qǐng)求過(guò)程中都是固定的,我們希望是這種信息在本次請(qǐng)求內(nèi),一次賦值,到處使用。本文就來(lái)探討一下,如何在.NET?Core?下去利用AsyncLocal?實(shí)現(xiàn)全局共享變量2022-04-04
.net?core?刪除字符串最后一個(gè)字符的七大類(lèi)N種實(shí)現(xiàn)方式(總結(jié)篇)
本文詳細(xì)介紹了七大類(lèi)、N種不同的方法來(lái)刪除字符串的最后一個(gè)字符,涵蓋了從簡(jiǎn)單的字符串方法到使用StringBuilder、數(shù)組操作、Linq以及正則表達(dá)式等多種技術(shù)手段,本文給大家介紹.net?core刪除字符串最后一個(gè)字符,感興趣的朋友一起看看吧2024-10-10
將Access數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入到SQL Server中的詳細(xì)方法實(shí)例
將Access數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入到SQL Server中的詳細(xì)方法實(shí)例,需要的朋友可以參考一下2013-03-03
asp.net?core集成ElasticSearch實(shí)現(xiàn)全文檢索功能
索引是Elasticsearch中用于存儲(chǔ)文檔的容器,你可以使用Elasticsearch的REST?API、官方客戶(hù)端庫(kù)(如NEST)或Kibana等工具來(lái)創(chuàng)建和管理索引,本文給大家介紹asp.net?core集成ElasticSearch實(shí)現(xiàn)全文檢索功能,感興趣的朋友一起看看吧2024-08-08
看到本質(zhì)而不是現(xiàn)象--解決ASP.NET CS0016的問(wèn)題
看到本質(zhì)而不是現(xiàn)象--解決ASP.NET CS0016的問(wèn)題...2007-01-01
ASP.NET AJAX 4.0的模版編程(Template Programming)介紹
不過(guò)當(dāng)我評(píng)估ASP.NET AJAX 4.0的時(shí)候,我確實(shí)被它的特征給震住了。新的特征完全專(zhuān)注于瀏覽器技術(shù),比如XHTML和javascript。 我非常欽佩ASP.NET AJAX小組。2009-07-07

