ÔÚ¿ª·¢»ùÓÚMicrosoft IISµÄÓ¦ÓÃʱ£¬¿ª·¢Õß³ýÁË¿ÉÒÔ±àдASP³ÌÐòÍ⣬»¹¿ÉÒÔʹÓÃVisual C++µÈ¿ª·¢¹¤¾ß£¬¿ª·¢ISAPIÓ¦Óã¬ÒÔ»ñÈ¡¸üΪǿ´óµÄ¹¦ÄÜ¡£¿ÉÒÔ±àдÁ½ÖÖISAPIÀ©Õ¹£ºÒ»ÖÖÊÇISAPI Server Extention£¬ÁíÒ»ÖÖÊÇISAPI Filter£¬µ«ÊÇ£¬ISAPIÀ©Õ¹Ó¦Óõıàдͨ³£¶Ô¿ª·¢ÕßÓбȽϸߵÄÒªÇ󣬿ª·¢ºÍ²¿ÊðµÄÄÑ¶È±È½Ï´ó¡£ ÔÚ¿ª·¢ASP.NetÓ¦ÓÃʱ£¬ÎÒÃÇÈÔÈ»¿ÉÒÔ±àдISAPIÓ¦Óã¬ÒÔÀ©³äIISµÄ¹¦ÄÜ£¬µ«ÊÇ£¬ASP.NetΪÎÒÃÇÌṩÁËÁíÍâÒ»ÖÖÑ¡Ôñ¡ª¡ªÊ¹ÓÃHTTP Handler ºÍHTTP Module¡£ÕâÊÇͨ¹ýʹÓÃIHttpHandler ºÍ IHttpModule½Ó¿ÚÀ´ÊµÏֵġ£HTTP HandlerÌṩÁËÀàËÆÓÚISAPI Server ExtentionµÄ¹¦ÄÜ£¬¶øHttpModuleʵÏÖÁËÀàËÆÓÚISAPI FilterµÄ¹¦ÄÜ£¬²¢ÇÒ£¬±ÈISAPI£¬ÔÚ¿ª·¢ºÍ²¿ÊðÉ϶¼Òª¼òµ¥µÄ¶à¡£ Ó¦ÓÃHttpHandlerºÍHttpModule£¬Ê¹Ó¦ÓóÌÐò¿ÉÒÔÓëIIS Web·þÎñÆ÷µÄµÍ¼¶±ðÇëÇóºÍÏìÓ¦·þÎñ½»»¥¡£±¾ÎÄÊ×ÏȽéÉÜHttpHandlerºÍHttpModuleµÄ¸ÅÄîºÍ»ù±¾Ê¹Ó÷½·¨£¬²¢½éÉÜÁËÒ»¸öÓ¦ÓÃHttpModuleʵÏÖȨÏÞϵͳµÄ°¸Àý¡£
HTTP ´¦Àí¹ÜµÀµÄ»ù±¾Ä£ÐÍ
Òª¶ÔHttpModuleºÍIHttpHandler½øÐÐÑо¿£¬±ØÐëÏȶÔASP.NetµÄ´¦Àí¹ÜµÀÓÐÒ»¸öÁ˽⡣ ÔÚASP.NetÓ¦ÓóÌÐòÖУ¬ÏµÍ³Ê¹ÓÃÒ»×éÏà¹ØµÄÀ࣬ͨ¹ýÒ»¶¨µÄ˳ÐòÀ´´¦Àí¿Í»§¶ËµÄÇëÇó(Request)£¬ASP.NETÓ¦ÓóÌÐòµÄ´¦Àíģʽ¿É³ÆÖ®ÎªHTTP´¦Àí¹ÜµÀ¡£HttpModuleºÍIhttpHandler¾ÍÊÇÕâ¸ö´¦Àí¹ÜµÀÉϵÄÁ½¸ö´¦Àí»·½Ú¡£ HTTP´¦Àí¹ÜµÀÖеÄÀàÔÚSystem.WebÃû³Æ¿Õ¼äÖж¨Ò壬Ö÷ÒªÓÐÒÔÏÂÀàÐÍ£º · HttpWorkerRequest ³éÏóÀඨÒåÁËASP.NetÒ³Ãæ´¦ÀíÇëÇóµÄ»ù±¾·½·¨£» · HttpRuntime ÌṩÁË´¦ÀíÓ¦ÓõÄÒ»×é·þÎñ£» · HttpContext ±£´æÁË´¦ÀíÒ»´ÎÇëÇóµÄËùÓÐÏà¹ØÉÏÏÂÎÄÐÅÏ¢£» · HttpApplicationFactory ÌṩÏà¹ØÄ¿Â¼µÄÓ¦ÓóÌÐò£» · HttpApplication ¶¨ÒåÁËËùÓÐASP.NetÓ¦ÓóÌÐòµÄͨÓõķ½·¨¡¢ÊôÐÔºÍʼþ¡£Õâ¸öÀàÒ²ÊÇÔÚÓû§ÔÚglobal.asaxÎļþÖж¨ÒåµÄÓ¦ÓõĻùÀࣻ · Modules ´¦ÀíÇëÇóǰºÍÏìÓ¦ºóµÄʼþ£» · HandlerFactories ÌṩӦÓóÌÐòÖеÄHandlers£» · Handlers ´¦ÀíÇëÇóºÍÏìÓ¦¡£ HTTP´¦Àí¹ÜµÀµÄÄ£ÐÍÈçÏ£º
ͼ1£ºHTTP ´¦Àí¹ÜµÀ
ÔÚWindowsƽ̨ÉÏ£¬HTTP PiplineÐèÒªIISµÄÖ§³Ö¡£ÎªÁËÔËÐÐASP.NETÓ¦Óã¬IISÐèÒªÒÔÏÂÁ½¸öÎļþ£ºASPNET_ISAPI.DLLºÍASPNET_WP.EXE · ASPNET_ISAPI.DLLÊÇÒ»¸öISAPI ExtentionËû½«·¢ÏòIISµÄÇëת½»ASPNET_WP.EXE´¦Àí · ASPNET_WP.EXEʹÓÃHttpRuntime¶ÔÇëÇó½øÐоßÌå´¦Àí ´¦ÀíµÄ¹ý³Ì¿ÉÒÔÓÃͼ±íʾÈçÏ£º
ͼ2£ºIISÉϵÄHTTP´¦Àí¹ÜµÀ
HttpHandlerµÄʵÏÖ
HttpHandlerʵÏÖÁËÀàËÆÓÚISAPI ExtentionµÄ¹¦ÄÜ£¬Ëû´¦ÀíÇëÇó(Request)µÄÐÅÏ¢ºÍ·¢ËÍÏìÓ¦(Response)¡£HttpHandler¹¦ÄܵÄʵÏÖͨ¹ýʵÏÖIHttpHandler½Ó¿ÚÀ´´ïµ½¡£Êµ¼ÊÉÏ£¬ÎÒÃÇÔÚ±àдASP.NetÒ³ÃæÊ±£¬ASP.NetÒ³ÃæËù¼Ì³ÐµÄ»ùÀࡪ¡ªSystem.Web.UI.Page¡ª¡ªÒ²ÊµÏÖÁËHttpHandler½Ó¿Ú£¬Ò²ÊÇÒ»¸öHttpHandler£¬¿´Ò»ÏÂËüµÄ¶¨Òå¾ÍÖªµÀÁË£¨C#£©£º
public class Page : TemplateControl, IhttpHandler
½Ó¿ÚIHttpHandlerµÄ¶¨ÒåÈçÏ£º
interface IHttpHandler
{
void ProcessRequest(HttpContext ctx);
bool IsReuseable { get; }
}
½Ó¿ÚÖÐProcessRequestÊÇÌí¼Ó×Ô¼ºµÄ´úÂ룬½øÐÐÏàÓ¦´¦ÀíµÄµØ·½¡£IsReuseableÊôÐÔÖ¸Ã÷¸ÃHttpHandlerµÄʵÏÖÀàÊÇ·ñÐèÒª»º´æ¡£ ÏÂÃæµÄʾÀýչʾÁËHttpHandlerµÄ»ù±¾Ê¹Ó㺠1¡¢½¨Á¢Ò»¸öÃûΪMyNameSpaceµÄ¹¤³Ì£¬Ìí¼ÓÒ»¸öÀ࣬Ãû³ÆÎªMyHandler£¬´úÂëÈçÏ£º
Àý1£º
namespace MyNameSpace
{
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
HttpResponse Response
Response.Write(This is my handler);}
public bool IsReusable
{
get { return true; }
}
}
}
2¡¢½«ÉÏÃæµÄ´úÂë±àÒ룬Éú³ÉMyNameSpace.DllÎļþ£» 3¡¢½¨Á¢Ò»¸öеÄWebApplicationÏîÄ¿£¬»ò´ò¿ªÒ»¸öWebApplicationÏîÄ¿£¬½«ÎļþMyNameSpace.DllÌí¼Óµ½ÏîÄ¿µÄÒýÓÃÖУ¬»ò¸´ÖƵ½ÏîÄ¿µÄbinĿ¼Ï£» 4¡¢ÐÞ¸ÄWeb.Config£¬Ìí¼ÓÈçÏÂÄÚÈÝ:
type= MyNameSpace.MyHandr, MyNameSpace /> ÅäÖÃÎļþÖеÄÑ¡Ïî˵Ã÷£º · verb¿ÉÒÔÊÇGET»òPOST£¬±íʾ¶ÔGET»òPOSTµÄÇëÇó½øÐд¦Àí¡£*±íʾ¶ÔËùÓÐÇëÇó½øÐд¦Àí¡£ · PathÖ¸Ã÷¶ÔÏàÓ¦µÄÎļþ½øÐд¦Àí£¬*.ASPx±íʾ¶Ô·¢¸øËùÓÐASPXÒ³ÃæµÄÇëÇó½øÐд¦Àí¡£¿ÉÒÔÖ¸Ã÷·¾¶£¬Èç/test/*.ASPx£¬±íÃ÷Ö»¶ÔtestĿ¼ÏµÄASPXÎļþ½øÐд¦Àí¡£ · TypeÊôÐÔÖУ¬¶ººÅǰµÄ×Ö·û´®Ö¸Ã÷HttpHandlerµÄʵÏÖÀàµÄÀàÃû£¬ºóÃæµÄ×Ö·û´®Ö¸Ã÷DllÎļþµÄÃû³Æ¡£ ÏÖÔÚ£¬ÇëÇóÏîÄ¿ÖеÄÈκÎASPXÒ³Ãæ£¬Ò³ÃæÉÏÏÔʾµÄʼÖÕÖ»ÓÐÈçÏÂÒ»ÐÐ×Ö£º This is my handler ÒòΪ£¬ÎÒÃÇ×Ô¶¨ÒåµÄHandler½Ø»ñÁËËùÓз¢ÏòASPXÒ³ÃæµÄÇëÇ󣬲¢ÇÒÓÃ×Ô¼ºµÄµÄ·½·¨À´´¦ÀíÕâЩÇëÇóÁË¡£ ΪÁËʹÎÒÃǵÄASPXÒ³ÃæÄܹ»Ë³ÀûÔËÐУ¬ÎÒÃÇÐèÒªÐÞ¸ÄWeb.ConfigÎļþ£º type= MyNameSpace.MyHandr,hander /> ΪÁËÈöԺó׺ÃûΪ.fooµÄÎļþµÄÇëÇóÄܹ»±»ÎÒÃǵÄHandler½Ø»ñÔËÐУ¬ÎÒÃÇ»¹ÐèҪһЩ¶îÍâµÄ¹¤×÷¡£´ò¿ªIISµÄ¹ÜÀí¿ØÖÆÌ¨£¬ÓÖ¼üµ¥»÷Õ¾µã£¬Ñ¡ÔñÊôÐÔ£¬Ìø³öÕ¾µãµÄÊôÐÔ¶Ô»°¿ò¡£Ñ¡ÔñÖ÷Ŀ¼ѡÏî¡£Èçͼ3£º ͼ3£ºWebÕ¾µãÊôÐÔ¶Ô»°¿ò Ñ¡ÔñÅäÖ㬵¯³öÓ¦ÓóÌÐòÅäÖöԻ°¿ò£¬½«.fooÌí¼Óµ½Ó¦ÓóÌÐòÓ³ÉäÖУ¬Èçͼ4£º ͼ4£ºÌí¼ÓÓ¦ÓóÌÐòÓ³Éä ºÃÁË£¬ÎÒÃÇÏÖÔÚ¿ÉÒÔÔÚÏîÄ¿ÖÐÌí¼ÓÒ»¸ö.fooÎļþ£¬µ±Ïò¸ÃÎļþ·¢ËÍÇëÇóʱ£¬ä¯ÀÀÆ÷ÏÔʾ£º This is my handler ¶ø¶ÔÆäËûASPXÎļþµÄ·ÃÎʲ»ÊÜÓ°Ïì¡£ ʵÏÖHandler Factory ʵÏÖHttpHandler¹¦ÄܵÄÁíÍâÒ»¸öÑ¡ÔñÊÇʵÏÖÒ»¸öHandler Factory£¬ÕâÊÇͨ¹ýʵÏÖIHttpHandlerFactory½Ó¿ÚÀ´ÊµÏֵġ£ IHttpHandlerFactory½Ó¿ÚµÄ¶¨ÒåÈçÏ£º interface IHttpHandlerFactory { IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated); void ReleaseHandler(IHttpHandler handler); } GetHandler·½·¨ÔÚÇëÇó¿ªÊ¼µÄʱºò±»µ÷Ó㬶øReleaseHandlerÔÚÇëÇó½áÊø£¬ËùÓеÄHandler¶¼²»ÔÙÐèÒªµÄʱºò±»µ÷ÓᣠʹÓÃHttpHandlerFactoryµÄ¹ý³ÌÒ»°ãÈçÏ£º Ê×Ïȶ¨Òåʵ¼Ê´¦ÀíHttpHandlerµÄÀ࣬Õâ¸öÀà»áÔÚHandlerFactoryÖб»µ÷ÓÃÒÔ½øÐÐʵ¼ÊµÄ´¦Àí£º public class BasicHandler : IHttpHandler { ... } È»ºó£¬¶¨Òå×Ô¼ºµÄHandlerFactory£º public class BasicHandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated) { return new BasicHandler(); } public void ReleaseHandler(IHttpHandler handler) {} } ×îºó£¬ÔÚWeb.ConfigÎļþÖÐ×¢²áÕâ¸öFactory£º type=MyNamespace.BasicHandlerFactory, MyAssembly /> Òì²½Handler ͨ¹ýʵÏÖIHttpAsyncHandler¿ÉÒÔʵÏÖ¶ÔHTTPÇëÇóµÄÒì²½´¦Àí¡£IHttpAsyncHandler½Ó¿Ú¼Ì³ÐIHttpHandler£¬Ò²ÐèҪʵÏÖProcessRequest ·½·¨ºÍ IsReusable ÊôÐÔ£¬Í¬Ê±£¬ÐèҪʵÏÖ BeginProcessRequest ºÍ EndProcessRequest ·½·¨¡£BeginProcessRequest Æô¶¯Òì²½µ÷ÓÃÒÔ´¦Àíµ¥¸öµÄ HTTP ÇëÇ󣬶ø EndProcessRequest ÔòÔڸýø³Ì½áÊøÊ±Ö´ÐÐÇåÀí´úÂë¡£ IHttpAsyncHandlerµÄʵÏÖºÍ×¢²áͬIHttpHandlerÀàËÆ£¬¶ÁÕß¿ÉÒԲο¼MSDNµÄÏà¹ØÎĵµ¡£ ÏÖÔÚ£¬´ó¼ÒÊÇ·ñ¶ÔHTTP HandlerµÄ¸ÅÄîºÍÓ¦ÓÃÓÐÁËÒ»¶¨µÄÁ˽⣿ÔÚÏÂһƪÎÄÕÂÖУ¬ÎÒÃǽ«Ö÷Òª½éÉÜHTTP ModuleµÄµÄÓ¦Ó㬲¢¸ø³öʹÓÃHttpModuleʵÏÖȨÏÞϵͳµÄʵÀý¡£ ¡¡ ×öÈËÒªºñµÀ£¬Çë×¢Ã÷ת×Ô¿áÍø¶¯Á¦(www.ASPCOOL.COM)¡£

