ASP
當請求一個*
inetinfo
ASPNET_ISAPI
aspnet_wp
ASP
HttpRequest
ASP
注意
當請求到達HttpModule的時候
HttpModule
HTTP模塊是實現了System
IHttpModule接口的聲明
public interface IHttpModule
{
void Init (HttpApplication context);
void Dispose ();
}
Init 方法
Dispose方法
HTTP模塊可以向System
AcquireRequestState 當ASP
AuthenticateRequest 當ASP
AuthorizeRequest 當ASP
BeginRequest 當ASP
Disposed 當ASP
EndRequest 把響應內容發送到客戶端之前引發這個事件
Error 在處理HTTP請求的過程中出現未處理異常的時候引發這個事件
PostRequestHandlerExecute 在HTTP處理程序結束執行的時候引發這個事件
PreRequestHandlerExecute 在ASP
PreSendRequestContent 在ASP
PreSendRequestHeaders 在ASP
ReleaseRequestState 當ASP
ResolveRequestCache 我們引發這個事件來決定是否可以使用從輸出緩沖返回的內容來結束請求
UpdateRequestCache 當ASP
BeginRequest和PreRequestHandlerExecute之間的事件是在服務器執行HttpHandler處理之前觸發
PostRequestHandlerExecute和PreSendRequestContent之間的事件是在服務器執行Handler處理之後觸發
下面我們看一下如何使用HttpModule來實現我們日常的應用
HttpModule通過在某些事件中注冊
有的網站每一個頁面都會彈出一個廣告或在每個頁面都以注釋形式(<!
有了HttpModule我們就可以很簡單地解決這個問題了
這段代碼究竟該在哪個事件裡實現呢? PostRequestHandlerExecute和PreSendRequestContent之間的任何一個事件都可以
第一步
第二步
class TestModule:IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
}
}
第三步
class TestModule:IHttpModule
{
public void Dispose(){}
public void Init(HttpApplication context)
{
context
}
void context_EndRequest(object sender
{
HttpApplication ha = (HttpApplication)sender;
ha
}
}
第四步
<httpModules>
<add name=
</httpModules>
name
type
這樣在Web站點是添加該類庫的引用後
大家在作登錄時
在比較大的程序中
由於在這裡我們要用到Session中的內容
第一步
第二步
class TestModule:IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
}
}
第三步
class AuthenticModule:IHttpModule
{
public void Dispose(){}
public void Init(HttpApplication context)
{
context
}
void context_PreRequestHandlerExecute(object sender
{
HttpApplication ha = (HttpApplication)sender;
string path = ha
int n = path
if (n ==
{
if (ha
{
ha
}
}
}
}
第四步
protected void Button
{
if(true) //判斷用戶名密碼是否正確
{
if (Request
{
string s = Request
Session[
Response
}
else
{
Response
}
}
}
第五步
<httpModules>
<add name=
</httpModules>
如果定義了多個HttpModule
HttpHandler
HttpHandler是HTTP請求的處理中心
HttpHandler與HttpModule不同
IHttpHandler接口聲明
public interface IHttpHandler
{
bool IsReusable { get; }
public void ProcessRequest(HttpContext context); //請求處理函數
}
示例
class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
FileStream fs = new FileStream(context
byte[] b = new byte[fs
fs
fs
context
}
public bool IsReusable
{
get
{
return true;
}
}
}
Web
<httpHandlers>
<add verb=
</httpHandlers>
Verb屬性
Path屬性
Type屬性
這樣程序運行的效果是該網站的任何一個頁面都會顯示worm
根據這個例子大家可以考慮一下如何編寫
IHttpHandler工廠
IHttpHandlerFactory的作用是對IHttpHandler進行管理
IHttpHandlerFactory接口的聲明
public interface IHttpHandlerFactory
{
IHttpHandler GetHandler (HttpContext context
void ReleaseHandler (IHttpHandler handler);
}
GetHandler返回實現IHttpHandler接口的類的實例
示例
有兩個HttpHandler
//將圖片顯示在頁面上的Handler
class TestHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
FileStream fs = new FileStream(context
byte[] b = new byte[fs
fs
fs
context
}
public bool IsReusable
{
get
{
return true;
}
}
}
//生成驗證碼的Handler
class CodeHandler:IHttpHandler
{
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
Image b = new Bitmap(
Graphics g = Graphics
SolidBrush sb = new SolidBrush(Color
Font f = new Font(
string str =
Random r = new Random();
for (int i =
{
str += r
}
g
b
}
}
IHttpHandler工廠
class TestHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context
{
string fname = url
while (fname
fname = fname
string cname = fname
string className =
className =
object h = null;
try
{
//h = new TestHandler();
h = Activator
}
catch (Exception e)
{
throw new HttpException(
}
return (IHttpHandler)h;
}
public void ReleaseHandler(IHttpHandler handler)
{
}
}(車延祿)
配置文件
<httpHandlers>
<add verb=
</httpHandlers>
這樣TestHandlerFactory就會根據請求的不同頁面執行不同的HttpHandler處理程序了
HttpHandler使用會話
如果要在處理程序中使用Session
寧可去碰壁
From:http://tw.wingwit.com/Article/program/net/201311/12275.html