一、前言
說來這片簡單的教程還真是碰巧,是剛好我在寫另一個頁指令的時候看到的。就跟著進來看了看是什么東西,發(fā)現(xiàn)比我們之前只會用.ashx,并且只能在申請這個文件才可以進行響應(yīng)。這些似乎讓它變不靈活,不能讓我們靈活的應(yīng)用。而自定義HTTP處理程序可以完全消除上面的問題,它只是一個.cs的類文件,并且你只要按照很簡單的準(zhǔn)備工作就可以獲得很多的靈活度:
1.可以自定義用戶訪問何網(wǎng)頁時響應(yīng)該文件并把數(shù)據(jù)呈現(xiàn)發(fā)送給客戶端
2.可以對所有具有一致的后綴名的請求文件定義一個處理程序
3.具有同步與異步選擇
我相信一定有人對于上面的說有一定不的理解,這里我需要解釋它的一個重要意義,那么大家就自然知道它的靈活所在了。
我們先舉例:
1.比如你訪問 http://www.****.com/web1.msll
你一定發(fā)現(xiàn)了問題所在.后綴名是 .msll 你瀏覽網(wǎng)頁到如今一定沒有見過。而這個的確就是自定義HTTP處理程序的一個特點所在,后綴名可以自己偽造。這個時候你一定會認(rèn)為 web1 是那個 .cs 文件的名稱,但是結(jié)果是 web1 根本不是那個 .cs 文件的文件名.他們是通過綁定來實現(xiàn)的。比如我實現(xiàn)了一個 he.cs 的類,然后我將其綁定到 hehehe.ppd 那么當(dāng)你訪問 http://www.*****.com/hehehe.ppd 那么響應(yīng)這個頁面的是 he.cs 的輸出結(jié)果
2.我們還是假設(shè)你訪問 http://www.****.com/list1.ssm
http://www.****.com/list2.ssm
http://www.****.com/list3.ssm
假如我告訴你這個三個看似不同的頁面其實都是一個 HTTP處理程序的輸出結(jié)果,這個其實很好理解,如果我寫了一個 bbsss.cs 的類,并且實現(xiàn)了有關(guān)功能。然后我將其綁定到 *.ssm 你可以發(fā)現(xiàn)這里是 *.ssm 這個時候你就按照你正常的思考,就是只要是對后綴名是 .ssm 頁面的申請都是使用同一個 bbsss.cs 類,這下是不是有趣了
二、注冊與綁定
為什么要有這兩部呢?而且還是要注冊與綁定這兩個呢?
答案是 你只寫一個類 vs是不可能知道你這個東西是干什么的,所以我們需要在 web.config 中注冊我們自定義的HTTP處理程序。而綁定則是讓iis知道我們這個站點中含有一個自定義的HTTP處理程序。(下面我將以 iis7 為例說明如何綁定)
1.注冊
復(fù)制代碼 代碼如下:
configuration>
system.web>
httpHandlers>
add verb="*" path="!-- 這里寫需要綁定的客戶端申請的頁面(*.smm,*.ffs,web1.ffe) -->" type="!-- 這里寫處理程序的類名 -->"
/httpHandlers>
/system.web>
/configuration>
以上需要自行編寫的部分我都已使用注釋寫好
2.綁定( iis7 )
1) 打開 iis7 -》 打開 網(wǎng)站 節(jié)點 -》 點擊你的網(wǎng)站的名稱
2) 雙擊 ![](/d/20211017/516ab3db3d994ef1174fd01b73282ab5.gif)
3) 點擊![](/d/20211017/70592110116f4eb260002949a89b08d3.gif)
4) ![](/d/20211017/003e30f0220a7a243cc297b6a7090ff5.gif)
5) 最后點擊 確定 這樣在 iis 中的綁定就完成了(后面的完整例子我將會以文字介紹該過程)
三、關(guān)于類的實現(xiàn)注意點
雖然我們介紹完了注冊與綁定,但還不是所有,關(guān)于類的實現(xiàn)也有一定的要求。根據(jù)MSDN文檔的說明必須實現(xiàn) ProcessRequest 方法與 IsReusable 屬性
關(guān)于 ProcessRequest 可以暫時理解為 Page_Load (即使他比Page_Load更底層)
其次就是沒有內(nèi)置的 Request 與 Response ,可能有些人要崩潰了那怎么寫啊,很簡單的問題沒有內(nèi)置我們就自己去定義
IsReusable 的類型是 bool 類型,而且只要實現(xiàn) get 不需要實現(xiàn) set ,如果返回 true 表示使用線程池 如果為 false 表示不使用
關(guān)于這個類文件的放置也有要求,要放在App_Code 文件夾下(vs的站點中可以直接新建這個特殊的文件夾)
四、完整的例子(自行新建類)
1.
以下為 HelloWorldHandler.cs 類的具體實現(xiàn)(放置在 App_Code 文件夾下)
復(fù)制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// summary>
///HelloWorldHandler 的摘要說明
/// /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)容
復(fù)制代碼 代碼如下:
httpHandlers>
add verb="*" path="*.sample" type="HelloWorldHandler" />
/httpHandlers>
3.IIS 配置(不要忘記把項目部署到 iis 中)
以下為具體配置
![](/d/20211017/b57b229552c391b4e430b7cc02e8f8d5.gif)
然后測試 http://localhost/SampleApplication/test.sample(端口為 80 時)
你就可以看到你的成果了
五、完結(jié)
到此你已經(jīng)基本掌握了 自定義同步HTTP處理程序 ,當(dāng)然這個只是一小部分,后面我們還會接觸到異步,因為同步在用戶訪問量很大的情況下將會使服務(wù)器資源迅速耗盡,而且也會讓降低用戶的實用性