Ò³Ãæµ¼º½£º Ê×Ò³ ¡ú ÍøÂç±à³Ì ¡ú ASP.NET ¡ú ʵÓü¼ÇÉ ¡ú ÕýÎÄÄÚÈÝ ÔÚASP.NETÖÐÓÃMSDNURLRewritingʵÏÖUrl Rewriting

ÔÚASP.NETÖÐÓÃMSDNURLRewritingʵÏÖUrl Rewriting

·¢²¼£ºdxy ×ÖÌ壺[Ôö¼Ó ¼õС] ÀàÐÍ£º×ªÔØ
×÷ÕߣºScott Mitchell
·­Ò룺Janssen

1.0.ÇëÒ»¶¨Òª±§×ÅÅúÆÀµÄ̬¶ÈÀ´¿´¸ÃÎÄÕÂ
1.1. ¸ÅÒª
·ÖÎöÈçºÎʹÓÃ΢ÈíÌṩµÄASP.NETÀ´¶Ô¶¯Ì¬²úÉúµÄURLµØÖ·½øÐÐÍøÖ·ÖØÐ´¡£ÍøÖ·ÖØÐ´ÊÇʵÏÖÒ»ÖÖ½ØÈ¡ÍøÖ·ÇëÇó²¢½«Æä½øÐд¦ÀíºóÖØÐÂÖ¸Ïòµ½Ò»¸öÖ¸¶¨µÄÍøÖ·µÄ¹ý³Ì¡£×÷Õß±¾ÈËÔÚ¶Ô¸÷ÖÖʵÏÖÍøÖ·ÖØÐ´µÄ¼¼Êõ½øÐÐÑо¿ºÍ̽ÌÖºóµÃ³öµÄ¾­ÑéºÍ·½·¨£¬Ï£ÍûÄܶÔÄúÓÐËù°ïÖú¡£

1.2. ÄÚÈݼò½é
ÉÔ΢»¨µãʱ¼ä¿´Ò»¿´Äã×öµÄÍøÕ¾ÀïÍ·µÄURLµØÖ·£¬Äã¿´µ½ÀàËÆÕâÑùµÄµØÖ·Âðhttp://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summary £¿Ò²ÐíÄã»á³öÓÚijÖÖÄ¿µÄ°Ñ´óÁ¿µÄÒ³ÃæÎļþ´ÓÒ»¸öĿ¼ÉõÖÁÒ»¸öÍøÕ¾×ªÒÆµ½ÆäËûµØ·½£¬¶øÐí¶à·ÃÎÊÕß³öÓÚ¸öÈËÐËȤ»òÕßÑо¿Ä¿µÄ֮ǰ¾ÍÒѾ­½«Ô­ÓÐÍøÖ·ÊÕ²ØÁËÆðÀ´£¬ Èç¹ûÕâʱËû´ÓÊղؼдò¿ª¸ÃÒ³ÃæµÄʱºò·¢ÏÖÕâÒѾ­ÊÇ»µÁ´ÁË¡£±¾ÎÄÖ¼ÔÚ½éÉÜÈçºÎʹÓÃÍøÖ·ÖØÐ´½«ÄÇЩ¡°ÄÑ¿´¡±µÄÍøÖ·×ª»»³É±È½ÏÓÐʵ¼ÊÒâÒåµÄÍøÖ·£¬Ê¹Æä±ãÓÚ¼ÇÒä¡£ÀýÈ罫http://yoursite.com/info/dispEmployeeInfo.aspx?EmpID=459-099&type=summaryת»»³ÉÈçϵØÖ·£ºhttp://yoursite.com/ dispEmployeeInfo/459-099/summary.html ¡£ÎÒÃÇÉõÖÁ·¢ÏÖÍøÖ·ÖØÐ´¼¼Êõ¿ÉÒÔ½â¾öÁîÈËÍ·ÌÛµÄ404´íÎ󣬻òÕß˵Ëü¿ÉÒÔ´´½¨Ò»¸öÖÇÄÜ»¯µÄ404´íÎó½â¾ö·½°¸¡£
ÈçÉÏËùÊö£¬ÍøÖ·ÖØÐ´ÊÇʵÏÖÒ»ÖÖ½ØÈ¡ÍøÖ·ÇëÇó²¢½«Æä½øÐд¦ÀíºóÖØÐÂÖ¸Ïòµ½Ò»¸öÖ¸¶¨µÄÍøÖ·µÄ¹ý³Ì¡£ÔÚÍøÖ·ÖØÐ´Ö´ÐÐµÄÆÚ¼ä£¬ÏàÓ¦´¦Àí³ÌÐò´¦Àí±»ÇëÇóµÄÍøÖ·£¬´ÓÖÐÌáÈ¡³öÏà¹ØµÄÖµ£¬È»ºóÖØÐÂÖ¸ÏòÒ»¸öеÄÖ¸¶¨µØÖ·¡£ÀýÈ磺ÓÉÓÚÒ»´ÎÍøÕ¾Ä¿Â¼µ÷Õû£¬Ô­ÓÐµÄ /people/ ×ÓĿ¼ÏµÄËùÓÐÍøÒ³È«²¿Òƶ¯µ½/info/employees/Ŀ¼£¬Ô­·ÃÎÊÕß´ÓÊղؼлòÕ߯äËûʲôµØ·½µã»÷Á´½Ó·¢³ö·ÃÎÊ/people/Ŀ¼ÏµÄÎļþµÄÇëÇóʱ£¬Äã¿Ï¶¨Ï£ÍûËû»¹ÊÇÄÜͨ¹ýÔ­ÓеØÖ·¿´µ½ºÍÔ­À´ÏàͬµÄÒ³Ãæ£¬µ«Êµ¼ÊÉÏ¿´µ½µÄÈ´ÊÇÍøÖ·ÖØÐ´Ö¸ÏòµÄÐÂĿ¼ÏµÄÏàÓ¦Îļþ¡£
ÔÚÀϰ汾ASPÖУ¬Ê¹ÓÃÍøÖ·ÖØÐ´¼¼ÊõµÄ;¾¶ºÜÉÙ£¬ÒªÃ´Ð´Ò»¸öISAPI¹ýÂËÆ÷£¬ÒªÃ´¹ºÂòµÚÈý·½³§ÉÌÌṩµÄÍøÖ·ÖØÐ´×é¼þ£¬È»¶øÔÚ΢ÈíÌṩµÄASP.NETÏÂÄã¿ÉÒÔͨ¹ý¶àÖÖ·½·¨ºÜ¼òµ¥µØ¿ª·¢³ö×Ô¼ºµÄÍøÖ·ÖØÐ´Èí¼þ£¬ÒÔÂú×ã×Ô¼º¸÷ÖÖ²»Í¬µÄÐèÒª¡£±¾ÎĽ«ºÍÄãÒ»ÆðÌÖÂÛÕâÃÅÕë¶ÔASP.NET¿ª·¢ÈËÔ±µÄʵÏÖÍøÖ·ÖØÐ´µÄ¼¼Êõ£¬È»ºó¾ÙÒ»Ð©ÍøÖ·ÖØÐ´Êµ¼ÊÓ¦ÓõÄÀý×Ó¡£ÔÚÎÒÃÇÉîÈë̽ÌÖÍøÖ·ÖØÐ´¼¼ÊõµÄϸ½Ú֮ǰ£¬ÎÒÃÇÏÈ¿´Ò»ÏÂÈÕ³£Ê¹ÓÃÍøÖ·ÖØÐ´¼¼ÊõʵÏֵij¡¾°¡£

1.3. ÍøÖ·ÖØÐ´µÄÒ»°ãÓÃ;
´´½¨Ò»¸öÊý¾Ý²Ù×÷µÄASP.NET³ÌÐò×î³£¼ûµÄ¾ÍÊÇÒ»¸öaspxÒ³ÃæºóÃæ´øÉÏһЩ²éѯ²ÎÊý¼¯ºÏ¡£ÀýÈçÔÚÉè¼ÆÒ»¸öµç×ÓÉÌÎñÍøÕ¾µÄʱºò£¬¼Ù¶¨ÄãÉè¼ÆÁËÒ»ÏÄÜÔÊÐíÓû§ä¯ÀÀ´ýÊÛµÄÉÌÆ·£¬ÎªÁ˸ü¼Ó·½±ã²Ù×÷£¬ÄãÉè¼ÆÁËÒ»¸öÒ³ÃædisplayCategory.aspx½«ÉÌÆ·°´ÕÕ¸ø¶¨µÄ·ÖÀàÏÔʾ£¬ÄÇô¸Ã·ÖÀàϵÄÉÌÆ·ÏÔÊ¾Ò³ÃæÉÏÓ¦¸ÃÔÚÒ³ÃæÎļþ¶ÔÓ¦ÍøÖ·ºóÃæ¼ÓÉÏÁËÒ»¸öÉÌÆ··ÖÀàµÄ²éѯ²ÎÊý£¬ÀýÈçÓû§Òª²éѯ´ýÊ۵ġ°×°ÊÎÆ·¡±£¬ÔÚÊý¾Ý¿âÖÐËùÓеÄ×°ÊÎÆ·Êý¾Ý¶ÔÓ¦µÄ·ÖÀà±àºÅCategoryIDµÄֵΪ5£¬ÄÇôÓû§»á·ÃÎÊÈçÏÂÍøÖ·£ºhttp://yoursite.com/displayCategory.aspx?CategoryID=5¡£
´´½¨Ò»¸ö°üº¬ÀàËÆÕâÑùÍøÖ·µÄÍøÕ¾×îÖÕÓÐÁ½ÖÖ½á¹û£¬Ê×ÏÈ´Ó×îÖÕÓû§µÄ½Ç¶ÈÀ´¹Û²ì£¬http://yoursite.com/displayCategory.aspx?CategoryID=5 Õâ¸öÍøÖ·ÓÐЩÔÓÂÒ£¬¿ÉÐÐÐÔ·ÖÎöר¼ÒJakob Neilson£¨Ö÷Ò³£ºhttp://useit.com/£© ½¨ÒéÑ¡ÔñÍøÖ·ÏÔʾ·½Ê½Ê±ºò¿¼ÂÇÈçÏÂÒªÇ󣨲ο¼ÍøÖ·£ºhttp://www.useit.com/alertbox/990321.html£©£º
     ¡ñ ÊÇ·ñ¼ò¶Ì
     ¡ñ ÊÇ·ñÒ×ÓÚÊäÈë
     ¡ñ ÊÇ·ñ½«Õ¾µã½á¹¹ÐÎÏó»¯
     ¡ñ ÊÇ·ñ¾ßÓÐÒþ±ÎÐÔ£¬Ò²¾ÍÊÇÈÃÓû§Í¨¹ýÒ»¸öÐéÄâµÄ¿´ËÆÓÐÒâÒåµÄµ¼º½µØÖ··ÃÎÊÖ¸Ïò¸ÃµØÖ·
ÎÒÏ뻹Ӧ¸ÃÔÚÉÏÊöÁбíÖÐÔÙÔö¼ÓÒ»Ìõ£ºÊÇ·ñ±ãÓÚ¼ÇÒä¡£http://yoursite.com/displayCategory.aspx?CategoryID=5 Õâ¸öµØÖ·Ã»ÓÐÒ»¸öµØ·½·ûºÏNeilson±ê×¼µÄÈκÎÒ»Ìõ£¬Ò²²»±ãÓÚ¼ÇÒä¡£µ±È»£¬¶ÔÓÚÓо­ÑéµÄÍøÂ翪·¢×¨¼ÒÀ´Ëµ£¬ËûÃǺÜÊìϤÕâÖÖ¼üÖµ¶Ô¹¹³ÉµÄ²éѯ²ÎÊý½á¹¹Ìåϵ£¬È»¶ø¶ÔÓÚÆÕͨÓû§À´ËµÊäÈëÕâЩ´øÓвÎÊýµÄÍøÖ·ÊµÔÚÊÇÌ«Âé·³ÁË¡£
Ò»ÖֽϺõķ½·¨¾ÍÊÇʹÓÃÒ»ÖֱȽÏÖ±¹ÛÇÒÈÝÒ×¼ÇÒäµÄ·½Ê½À´½«ÍøÖ·±íʾΪ£ºhttp://yoursite.com/products/Widgets Õ§Ò»¿´ºÜÈÝÒ׾ͻáÍÆ¶ÏÕâ¸öÍøÖ·Ëù¶ÔÓ¦µÄÄÚÈݼ«ÓпÉÄÜ»áÊÇÏÔʾװÊÎÆ·£¨Widgets£©ÐÅÏ¢£¬Õâ¸öÍøÖ·¾Í±äµÃ¸ü¼ÓÈÝÒ×¼ÇÒäºÍ´«²¥£¡È»ºóÎÒ¸æËßÎÒµÄͬÊ£º¡°Çë²é¿´Õâ¸öÍøÖ·£ºhttp://yoursite.com/products/widgets ¡±²»ÓÃÎÒ˵µÚ¶þ±é£¬Ëý¿ÉÄÜÒ»´Î¾Í°ÑµØÖ·Çõ½ä¯ÀÀÆ÷ÉÏÁË£¨ÄãÒ²¿ÉÒÔÔÚÑÇÂíÑ·£¨Amazon.com£©µÄÍøÕ¾ÉÏÕâÑù³¢ÊÔһϣ©¡£ºÜ¿ì¾Íä¯ÀÀÆ÷ÉϾÍÁгöÁË×°ÊÎÆ·£¨Widgets£©µÄÄÚÈÝ¡£ÕâÀï¡°Òþ±ÎÐÔ¡±±íʾ£ºÓû§¿ÉÒÔ×ÔÐбä¸üÍøÖ·µÄ½á⣬ÀýÈçÊäÈ룺http://yoursite.com/products ¾ÍÄÜ¿´µ½È«²¿·ÖÀàÏà¹ØµÄÉÌÆ·Áбí»òÕßÁгöËùÓÐÏà¹ØÉÌÆ··ÖÀàĿ¼ÁÐ±í¡£
×¢£ºÓÃÉÏÊö¼òµ¥µÄ±ä¸üÍøÖ·ÄÚÈݵķ½·¨À´¹¹Ë¼Ò»ÏÂÈç½ñµÄ±È½ÏÁ÷ÐеÄBlogÍøÕ¾Éú³ÉµÄÍøÖ·¡£ÀýÈ磺Ҫ²éѯ2004Äê1ÔÂ28ÈÕËù·¢µÄÌû×Ó£¬Ö»ÐèÊäÈë http://someblog.com/2004/01/28  ¼´¿É£¬Èç¹û½«ÍøÖ·²Ã¼õΪ http://someblog.com/2004/01 ÔòÏÔʾ 2004Äê1Ô·ݵÄÌû×Ó £¬Í¬Ñù½«Ô·ݲüõµôµÃµ½ http://someblog.com/2004 ÔòÏÔʾ³ö2004ÄêÈ«ÄêËù·¢µÄÌû×Ó¡£
ÍøÖ·ÖØÐ´¼¼Êõ³ýÁËÓÃÓÚ½«¸´ÔÓµÄÍøÖ·¼òµ¥»¯Ö®Í⣬Ëü»¹ÄÜÓÃÓÚ´¦ÀíÒòÍøÕ¾Ä¿Â¼µ÷Õû»òÕ߯äËûÔ­Òòµ¼Ö²úÉú´óÁ¿µÄÎÞЧÁ´½ÓºÍ¹ýÆÚÊéÇ©¡£
1.4. µ±Ò»¸öWebÇëÇó´«Ë͵½IIS»á·¢Éúʲô£¿
ÔÚ̽ÌÖÈçºÎʵÏÖÍøÖ·ÖØÐ´ÕâÏî¼¼Êõ֮ǰ£¬ºÜÓбØÒªÁ˽âÒ»ÏÂIISÊÇ´¦ÀíËù½ÓÊÕµÄWebÇëÇóµÄ»úÖÆ¡£µ±Ò»¸öWebÇëÇóµ½´ïIIS Web·þÎñÆ÷ʱ£¬IIS»á¸ù¾ÝËùÇëÇóµÄÎļþºó׺ÃûÀ´¾ö¶¨ÈçºÎ´¦Àí¸ÃÇëÇó£¬IIS¿ÉÒÔ´¦ÀíÖîÈçHTMLÒ³Ãæ¡¢Í¼Æ¬¡¢¾²Ì¬ÄÚÈÝ£¬»òÕß½«ÇëÇóת·¢¸øISAPIÓ¦ÓóÌÐò£¬ÓɸÃISAPIÓ¦ÓóÌÐò´¦ÀíºóÉú³ÉHTML¾²Ì¬ÄÚÈÝ·µ»Ø¸øIIS£¬×îºóÓÉIIS½«ÇëÇó½á¹û·¢Ëͻظø¿Í»§¶Ë¡££¨Ò»¸öISAPIÓ¦ÓóÌÐò¾ÍÊÇÒ»Ì×±àÒëºÃÄÜËæÊ±ÔÚºǫ́ÔËÐеÄÀà¿â£¬ËüµÄÈÎÎñ¾ÍÊǸù¾ÝÇëÇóÉú³ÉÏà¹ØµÄÄÚÈÝ¡££©
ÀýÈ磺Èç¹ûIIS½ÓÊÕµ½Ò»¸ö¶ÔInfo.aspµÄÇëÇó£¬Ëü»á½«¸ÃÇëÇóת½»¸øasp.dllÀ´´¦Àí£¬¸ÃISAPIÓ¦ÓóÌÐòµ÷³ö²¢Ö´ÐÐËùÇëÇóµÄASPÒ³Ãæ£¬È»ºó°ÑÉú³ÉµÄHTML´úÂë·µ»Ø¸øIIS£¬IIS×îºó°ÑÄÚÈÝ·¢ËÍ»ØÇëÇó¿Í»§¶Ë¡£¶ÔÓÚASP.NETÒ³Ãæ£¬IISÔò½«ÇëÇóת½»¸øÃûΪaspnet_isapi.dllµÄISAPIÓ¦ÓóÌÐòÀ´´¦Àí£¬¸ÃISAPIÓ¦ÓóÌÐòµ÷ÓÃÍйܵÄASP.NET¹¤×÷½ø³ÌÀ´´¦Àí¸ÃÇëÇ󣬲¢½«Éú³ÉµÄHTML´úÂë·µ»Ø¸øÇëÇó¿Í»§¶Ë¡£
Äã¿ÉÒÔ×Ô¶¨ÒåIIS£¬½«Ä³Ò»ÀàÀ©Õ¹ÃûÓ³Éäµ½Ö¸¶¨µÄISAPIÓ¦ÓóÌÐò£¬Í¼Ò»ÏÔʾÁËIIS¹ÜÀí¹¤¾ßÖеÄÓ¦ÓóÌÐòÅäÖöԻ°¿ò¡£

ͼһ£®ÒÑÅäÖõÄÎļþÀ©Õ¹ÃûÓ³Éä

¹ØÓÚ¶ÔIISÈçºÎ¹ÜÀíËù½ÓÊÕµÄÇëÇóµÄÏêϸ̽ÌÖÓÐЩ³¬³ö±¾ÎÄÄÚÈÝ£¬ÏëÁ˽âµÄ¸üÏêϸµÄ»°¿ÉÒԲο¼Michele Leroux BustamanteµÄÖø×÷Inside IIS and ASP.NET£¨ÉîÈëÑо¿IISÓëASP.NET£©£¬ÖØÒªµÄÊÇÒªÁ˽âASP.NETÒýÇæÖ»¸ºÔð´¦Àí¶ÔÀ©Õ¹ÃûÒѾ­±»ÕýÈ·ÅäÖÃÓ³Éäµ½aspnet_isapi.dllµÄÍøÂçÇëÇó¡£

1.5. ÓÃISAPI¹ýÂËÆ÷À´·ÖÎöÇëÇó
³ýÁ˽«ÇëÇóµÄÎļþÀ©Õ¹ÃûÓ³Éäµ½ÏàÓ¦µÄISAPIÓ¦ÓóÌÐòÍ⣬IIS»¹Ö´ÐÐһЩÆäËû¹¤×÷¡£ÀýÈçIIS»¹Ö÷¶¯¶Ô·¢³öÇëÇóµÄ¿Í»§¶ËÓû§½øÐÐÊÚȨ£¬²¢ÅжÏÒÑÊÚȨÓû§ÊÇ·ñ¶ÔÆäÇëÇóµÄÎļþÓµÓзÃÎÊȨÏÞ£¬ÔÚÒ»¸öÇëÇó¹ý³ÌµÄÈ«²¿ÉúÃüÆÚÄÚ£¬IISµÄ´¦Àí¾­ÀúÁ˼¸¸ö½×¶Î£¬ÔÚÿһ¸ö½×¶ÎIIS¶¼Éú³ÉÒ»¸öʼþ£¬¶ø¸Ãʼþ¿ÉÒÔ±»ISAPI¹ýÂËÆ÷ʵʱ²Ù¿ØµÄ¡£
ÈçͬISAPIÓ¦ÓóÌÐòÒ»Ñù£¬ISAPI¹ýÂËÆ÷Ò²ÊÇÒ»¿é¿é°²×°ÔÚWeb·þÎñÆ÷ÉϵķÇÍйܴúÂë¡£ISAPIÓ¦ÓóÌÐòÓÃÓÚ¶ÔËù½ÓÊÕµÄÌØ¶¨ÎļþÀàÐÍ×ö³öÏìÓ¦£¬¶øISAPI¹ýÂËÆ÷º¬ÓжÔIISÉú³ÉµÄʼþ×ö³öÏìÓ¦µÄ´úÂ루contain Code£©£¬ÉõÖÁ¿ÉÒԱ༭½ø³öµÄÊý¾Ý¡£ISAPIÒ²º¬ÓÐÖÚ¶àÓ¦ÓóÌÐò£¬°üÀ¨£º
    ¡¤ ȨÏÞ¿ØÖÆÓëÊÚȨ£¨Authentication and Authorization£©
    ¡¤ ÈÕÖ¾¼Ç¼Óë¼àÊÓ£¨Logging and Monitoring£©
    ¡¤ HTTPÄÚÈÝѹËõ£¨HTTP Compression£©
    ¡¤ ÍøÖ·ÖØÐ´£¨URL Rewriting£©
±¾ÎÄËù̽ÌÖµÄÓÃASP.NETʵÏÖµÄÍøÖ·ÖØÐ´¼¼Êõ¾ÍÊÇ»ùÓÚISAPI¹ýÂËÆ÷ÓÃÓÚÍøÖ·ÖØÐ´µÄ¼¼ÊõÄÚÈÝ£¬È»¶øÎÒÃÇÈÔȻҪÌÖÂÛһϾ¿¾¹ÊÇʹÓÃISAPI¹ýÂËÆ÷»¹ÊÇʹÓÃASP.NETÓ¦ÓóÌÐòÌṩµÄ¼¼ÊõÀ´ÊµÏÖÍøÖ·ÖØÐ´¼¼Êõ¡£


1.6. µ±Ò»¸öÇëÇó´«ÈëASP.NETÒýÇæµÄʱºò»á·¢Éúʲô£¿
ASP.NETÎÊÊÀ֮ǰ£¬ÔÚIIS Web·þÎñÆ÷ÉϵÄÍøÖ·ÖØÐ´¹¦ÄÜÐèҪͨ¹ýISAPI¹ýÂËÆ÷À´ÊµÏÖ£¬×Ô´ÓÕâ¸ö¼Ò»ïÎÊÊÀºóÎÒÃǾÍÄÜͨ¹ýASP.NETÀ´ÊµÏÖURLÖØÐ´ÁË£¬ÒòΪASP.NETµÄ½âÊÍÒýÇæÓëIISÓм«´óµÄÏàËÆÖ®´¦£¬²úÉúÕâЩÏàËÆÐÔÖ÷ÒªÊÇÒòΪASP.NET£º
    ¡¤ ÔÚ´¦Àí½ÓÊÕµÄÇëÇóµÄÉúÃüÆÚÄÚÒ²»á²úÉúʼþ£»
    ¡¤ ÔÊÐíÈÎÒâÊýÁ¿µÄHttpModule²Ù¿Ø²úÉúµÄʼþ£¬ÕâÓëIISÖеÄISAPI¹ýÂËÆ÷ÀàËÆ£»
    ¡¤ ½«ÇëÇóµÄ×ÊԴίÍиøHttpHandler´¦Àí£¬ÕâÓëIISÖеÄISAPIÓ¦ÓóÌÐòÀàËÆ¡£
ºÍIISÒ»Ñù£¬ÔÚÒ»¸öÇëÇóµÄÕû¸öÉúÃüÆÚÄÚ£¬ASP.NET¶Ô¸ÃÇëÇóµÄ´¦Àí״̬·¢³öµÄ״̬¸Ä±äÐźÅÒý·¢ÏàÓ¦µÄʼþ¡£ÀýÈ磺BeginRequestʼþÔÚASP.NET¿ªÊ¼ÏìÓ¦¿Í»§¶ËÇëÇó֮ʼÒý·¢£»AuthenticateRequestʼþÔÚASP.NETÈ·Á¢Óû§Éí·ÝºóÒý·¢£¬µ±È»»¹ÓÐÖîÈçAuthorizeRequest£¬ResolveRequestCacheºÍEndRequestµÈÆäËüºÜ¶àʼþ£¬ÕâЩ¶¼ÊÇSystem.Web.HttpApplicationÀàϵÄʼþ£¬¸ü¶àÐÅÏ¢Çë²Î¿¼¼¼ÊõÎĵµÖеÄÀàHttpApplication¸ÅÒª£¨HttpApplication Class Overview£©¡£
ÈçÉÏËùÊö£¬¿ÉÒÔ´´½¨ISAPI¹ýÂËÆ÷²¢ÓÃÓÚÏàÓ¦IISÒý·¢µÄʼþ£¬Í¬Àí£¬ASP.NETÒ²ÌṩÁËHttpModuleÓÃÓÚÏìÓ¦ASP.NETÒýÇæÒý·¢µÄʼþ£¬Ò»¸öASP.NETÓ¦ÓóÌÐòͨ¹ýÅäÖÿÉÒÔÓµÓжà¸öHttpModule¡£ASP.NETÒýÇæÃ¿´¦ÀíÒ»¸öÇëÇ󣬱ã³õʼ»¯Ò»¸öÏàÓ¦ÅäÖúõÄHttpModule£¬²¢ÔÊÐíËüÕë¶ÔÇëÇó´¦ÀíÆÚ¼äÒý·¢µÄʼþÉú³ÉÏàÓ¦µÄʼþίÍС£ÊÂʵÉÏASP.NETÒýÇæ´¦Àíÿһ¸öÇëÇóµ÷ÓôóÁ¿µÄʼþίÍС£FormsAuthenticationModule¾ÍÊÇÖÚ¶àÄÚǶHttpModuleÖеÄÒ»¸ö£¬ËüÊ×Ïȼì²éÊÇ·ñʹÓÃ±íµ¥ÊÚȨ£¬Èç¹ûÊǵϰ£¬Ëü½«¼ì²éÓû§ÊÇ·ñÒÑÊÚȨ£¬Èç¹ûûÓÐÊÚȨÔò×Ô¶¯°ÑÓû§Öض¨Ïòµ½Ö¸¶¨µÄµÇÂ¼Ò³Ãæ¡£
»ØÒäÔÚIISÖУ¬Ò»ÏîÇëÇó×îºó±»×ª½»¸øÒ»¸öISAPIÓ¦ÓóÌÐò´¦Àí£¬¸ÃÓ¦ÓóÌÐòÕë¶ÔÿһÏîÇëÇó½øÐд¦Àí²¢·µ»ØÏàÓ¦µÄÊý¾Ý¡£ÀýÈ磬¿Í»§¶Ë·¢³öÒ»¸ö·ÃÎʾ­µäASPÒ³ÃæµÄÇëÇó£¬IIS½«¸ÃÇëÇóת½»¸øasp.dll³ÌÐò´¦Àí£¬asp.dllÕë¶Ô¸ÃÇëÇóÖ´ÐÐaspÒ³ÃæÄÚÈÝ£¬²¢·µ»ØHTML±àÂë¡£ASP.NETҲʹÓÃÁËÀàËÆµÄÊÖ·¨£¬ASP.NETÒýÇæÔÚ½«ÕâЩHttpModule³õʼ»¯ºó£¬Åжϲ¢¾ö¶¨µ÷ÓÃÏàÓ¦µÄHttpModuleÀ´´¦Àí¸ÃÇëÇó¡£
ËùÓÐͨ¹ýASP.NETÒýÇæ½âÎöµÄÇëÇó×îÖÕ±»Ëͽ»Ò»¸öHttpHandler»òÕßHttpHandlerFactory£¨Ò»¸öHttpHandlerÖ»ÊǼòµ¥µØ·µ»ØÒ»¸öÓÃÓÚ´¦Àí¸ÃÇëÇóµÄHttpHandlerµÄʵÀý¡££©×îÖÕµÄίÍгÊÏÖ²¢ÏìÓ¦ËùÇëÇóµÄHTML±àÂ룬²¢·¢ËÍ»ØIIS£¬IISÔò½«HTML·µ»Ø¸øÇëÇó¿Í»§¶Ë¡£
ASP.NET°üº¬Ðí¶àHttpHandler£¬ÀýÈ磬PageHandlerFactoryÊÇÓÃÓÚ³ÊÏÖASP.NETÒ³ÃæÄÚÈÝ£¬WebServiceHandlerFactoryÓÃÓÚ³ÊÏÖASP.NET Web·þÎñµÄSOAPÊý¾Ý°ü£¬TraceHandlerÓÃÓÚ½«ASP.NETÇëÇó×ÊÔ´µÄHTML±ê¼ÇдÈëtrace.axd¡£
ͼ¶þÃè»æÁËÒ»¸öÕë¶ÔASP.NET×ÊÔ´µÄÇëÇóËù¾­¹ýµÄ´¦ÀíÁ÷³Ì¡£Ê×ÏÈ£¬IIS½ÓÊÕµ½¸ÃÇëÇó²¢½«Æäת½»¸øaspnet_isapi.dll¡£Æä´Î£¬ASP.NETÒýÇæ½«Ò»Ð©HttpModule³õʼ»¯¡£×îºó£¬×îÖÕµÄHttpHandler±»µ÷Óã¬Éú³ÉÏàÓ¦µÄ±ê¼ÇÓïÑÔ£¬²¢½«Æä·µ»Ø¸øIIS£¬×îÖÕ·µ»Øµ½ÇëÇó¿Í»§¶Ë¡£

ͼ¶þ£®IISºÍASP.NET¶ÔÇëÇóµÄ´¦Àí¹ý³Ì

1.7. ´´½¨²¢×¢²á×Ô¶¨ÒåHttpModuleºÍHttpHandler
´´½¨×Ô¶¨ÒåHttpModuleµÄ¹¤×÷Ïà¶Ô½Ï¼òµ¥£¬Ëü°üÀ¨Ò»¸öʵÏÖµ±Ç°½Ó¿ÚµÄÍйÜÀ࣬HttpModule±ØÐëʵÏÖSystem.Web.IHttpModule½Ó¿Ú£¬Í¬ÑùHttpHandlerºÍHttpHandlerFactory±ØÐë·Ö±ðʵÏÖSystem.Web.IHttpHandler½Ó¿ÚºÍSystem.Web.IhttpHandlerFactory½Ó¿Ú¡£Óйش´½¨HttpHandlerºÍHttpModuleµÄϸ½ÚÒѾ­³¬³ö±¾Ê鷶Χ£¬ÒªÁ˽â¸ü¶àÏêÇéÇë²ÎÔÄMansoor Ahmed SiddiquiµÄÎÄÕ¡¶HttpHandlers and HTTP modules in ASP.NET¡·£¨ASP.NETÖеÄHttpHandlerºÍHttpModule£©¡£
Ò»µ©HttpModuleºÍHttpHandler±»´´½¨ºó£¬±ØÐëÏòWebÓ¦ÓóÌÐò×¢²á¡£Èç¹ûÒªÏòÕû¸öWeb·þÎñÆ÷HttpModuleºÍHttpHandlerÖ»Ðè¼òµ¥µÄдÈëmachine.configÎļþ£»Èç¹ûÊÇÓÉÖ¸¶¨µÄWebÓ¦ÓóÌÐòµ÷ÓÃÔòÐèÔڸóÌÐòµÄweb.configÅäÖÃÎļþÖÐÌí¼Ó¼¸ÐÐXML±ê¼Ç¡£
ÀýÈ磬ҪÏòÖ¸¶¨µÄWebÓ¦ÓóÌÐò×¢²áHttpModuleºÍHttpHandler£¬Ö»ÐèÏò¸ÃWebÓ¦³ÌÐòµÄweb.configÅäÖÃÎļþÖÐconfiguration\System.Web½ÚÖÐÌí¼ÓÏÂÁм¸ÐУº

<HttpModules>
    
<add type="type" name="name" />
</HttpModules>

ÆäÖÐtypeÊôÐÔΪHttpModuleµÄ±êʶºÅºÍÀà¿âÃû³Æ£¬nameÊôÐÔÔòΪ¸ÃÄ£¿éȡһ¸ö½ÏΪÓѺõÄÃû³Æ·½±ãÔÚGlobal.asaxµ÷Óá£
HttpHandlerºÍHttpHandlerFactoryÔòÊÇÔÚweb.configÎļþÖÐconfiguration\System.Web½ÚÖÐÌí¼Ó<httpHandler>±ê¼Ç£¬ÀýÈ磺

<httpHandlers>
    
<add verb="verb" path="path" type="type" />
</HttpModules>

»ØÒäÉÏÎÄ£¬ASP.NET¶Ôÿһ¸ö½ÓÊÕµ½µÄÇëÇóÖ¸ÅÉÏàÓ¦µÄHttpHandlerÀ´´¦Àí²¢³ÊÏÖÏàÓ¦ÄÚÈÝ£¬¸ÃÖ¸Åɾö¶¨ÓÚËù½ÓÊÕÇëÇóµÄverbºÍpathµÄÄÚÈÝ£¬verbΪHTTPÇëÇóµÄÀàÐÍ£ºGET»òÕßPOST£¬pathÔòΪÇëÇóµÄÎļþµÄ·¾¶ºÍÎļþÃû¡£Èç¹ûÎÒÃÇ´òËãÓÃÒ»¸öHttpHandlerÀ´´¦ÀíËùÓÐGETÀàÐͺÍPOSTÀàÐ͵IJ¢ÇÒÎļþÀ©Õ¹ÃûΪ.scottµÄÄÚÈÝ£¬¿ÉÒÔÔÚweb.configÏàÓ¦ÅäÖýÚÖмÓÈëÏÂÁбê¼Ç£º

<httpHandlers>
    
<add varb="*" path=".scott" type="type" />
</httpHandlers>

ÆäÖÐtypeÊÇÎÒÃǶ¨ÒåµÄHttpHandlerµÄÀàÐÍ¡£
×¢Ò⣺ÔÚ×¢²áHttpHandlerµÄʱºò±ØÐë×¢ÒâHttpHandlerËùʹÓõÄÎļþÀ©Õ¹Ãû±ØÐëÒѾ­ÔÚIISÖÐ×öÖ¸ÏòASP.NETÒýÇæµÄÓ³É䣬ÔÚÉÏÃæ.scottÀ©Õ¹ÃûµÄÀý×ÓÖУ¬Èç¹ûÎÒÃÇËùʹÓõÄ.scottÀ©Õ¹ÃûÈç¹ûûÓÐÔÚIISÖÐ×öÖ¸ÏòASP.NETÒýÇæµÄÓ³ÉäµÄ»°£¬¼Ù¶¨¶Ôfoo.scottÎļþ·¢³öÇëÇ󣬸ÃÇëÇ󽫵¼ÖÂIIS½«foo.scottÎļþÄÚÈÝÖ±½Ó³ÊÏÖ¸ø¿Í»§¶Ë£¬ÎªÁËÄܹ»ÈÃHttpHandler´¦Àí¸ÃÇëÇ󣬱ØÐ뽫.scottÀ©Õ¹ÃûÔÚIISÖÐ×öÖ¸ÏòASP.NETÒýÇæµÄÓ³É䣬֮ºóIIS²ÅÄÜÕýÈ·µØ½«.scottµÄÇëÇóת½»¸øÏàÓ¦µÄHttpHandler¡£
ÓйØHttpModuleºÍHttpHandler¸üÏêϸµÄÄÚÈÝÇë²ÎÔÄMSDNÖÐ<HttpModules>½ÚºÍ<httpHandlers>½ÚµÄÎĵµÐÅÏ¢¡£
<HttpModules>Îĵµ²Î¿¼£»
<httpHandlers>Îĵµ²Î¿¼¡£

1.8. ÊµÏÖÍøÖ·ÖØÐ´
ÍøÖ·ÖØÐ´¼¼Êõ²»µ«¿ÉÒÔÔÚIIS Web·þÎñÆ÷Ò»¼¶Í¨¹ýISAPI¹ýÂËÆ÷ʵÏÖ£¬¶øÇÒ»¹¿ÉÒÔÔÚASP.NETÒ»¼¶Í¨¹ýHttpModule»òÕßHttpHandlerʵÏÖ¡£±¾ÎÄÖ÷Òª¹Ø×¢ÔÚASP.NETÒ»¼¶ÊµÏÖÍøÖ·ÖØÐ´¼¼Êõ£¬ËùÒÔ´Ëʱ²»±Ø¹Ø×¢ÔÚISAPIÓ¦ÓóÌÐòÖÐʵÏÖÍøÖ·ÖØÐ´µÄ¼¼Êõϸ½Ú£¬¶øÇÒÓкܶàµÚÈý·½³§ÉÌÌṩµÄISAPI¹ýÂËÆ÷£¬±ÈÈç
    HeliconµÄISAPI Rewrite£»
    QwerkSoftµÄIIS Rewrite£»Port80µÄPageXChanger£»
    µÈµÈ¡£

1.9. ¹¹½¨ÍøÖ·ÖØÐ´ÒýÇæ
ÔÚASP.NETÖÐʵÏÖÍøÖ·ÖØÐ´ºÜ¼òµ¥£¬Ö»Ðèµ÷ÓÃSystem.Web.HttpContextÀàµÄRewritePath()·½·¨¼´¿É¡£HttpContextÀàÖаüº¬ÓйØÓÚÌØ¶¨HTTPÇëÇóµÄHTTP¹æ·¶ÐÅÏ¢¡£ASP.NETÒýÇæÃ¿½ÓÊÕµ½Ò»¸öÌØ¶¨ÇëÇóºó±ãÕë¶Ô¸ÃÇëÇó´´½¨Ò»¸öÌØ¶¨µÄʵÀý£¬Õâ¸öÀà°üº¬Ò»Ð©ÊôÐÔÖîÈ磺RequestºÍResponseÊôÐÔ£¬·Ö±ðÌṩ¶ÔÇëÇóºÍÏìÓ¦µÄ·ÃÎÊ£»ApplicationºÍSessionÊôÐÔÌṩ¶ÔApplication±äÁ¿ºÍSession±äÁ¿µÄ·ÃÎÊ£»UserÊôÐÔÌṩ¶ÔÒÑÊÚȨÓû§ÐÅÏ¢µÄ·ÃÎÊ¡£
ÔÚ΢Èí.NET Framework 1.0°æ±¾ÖУ¬RewritePath()·½·¨½ÓÊÕÒ»¸öз¾¶µÄ¼òµ¥×Ö·û´®£¬ÔÚÆäÄÚ²¿HttpContextÀàµÄRewritePath(string)·½·¨ÄÚÔڵظüÐÂRequest¶ÔÏóµÄ·¾¶ºÍ²éѯ²ÎÊý¡£³ýÁËRewritePath(string)·½·¨Ö®Í⣬.NET Framework 1.1°æ»¹ÌṩÁËÁíÍâÒ»Ð©ÖØÔØ°æ±¾£¬ÆäÖÐÒ»¸öÖØÔØ°æ±¾½ÓÊÕÈý¸öÊäÈë×Ö·û´®²ÎÊý£¬ÕâÖÖ½»ÌæµÄÖØÔØÐÎʽ²»½ö½öÖ»ÊÇÉèÖÃRequest¶ÔÏóµÄ·¾¶ºÍ²éѯ²ÎÊýÕâЩÊôÐÔ£¬¶øÊÇÉèÖøüÉî²ãµÄ³ÉÔ±±äÁ¿£¬ÕâЩ³ÉÔ±±äÁ¿ÓÃÓÚΪPhysicalPath¡¢PathInfo¡¢FilePathÊôÐÔ¼ÆËãRequest¶ÔÏóÖµ¡£
ΪÁËʵÏÖASP.NETÖеÄÍøÖ·ÖØÐ´£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öHttpHandlerºÍHttpModuleÓÃÓÚ£º
 ¸ù¾ÝÇëÇóµÄ·¾¶¾ö¶¨ËùÐèÒªÖØÐ´µÄ·¾¶£»
 ÖØÐ´Â·¾¶£¬Èç¹ûÐèÒªµÄ»°¿ÉÒÔµ÷ÓÃRewritePath·½·¨£»
ÒÔǰÎÄËù¹¹½¨µÄÄǸöÕ¾µãΪÀý£¬¿ÉÒÔͨ¹ý/info/employee.aspx?empID=EmployeeIDÀ´·ÃÎÊÿһ¸ö¹ÍÔ±µÄÐÅÏ¢¡£ÎªÁËʹÕâ¸öÍøÖ·¸ü¼ÓµØ¾ßÓС°Òþ±ÎÐÔ¡±£¬ÎÒÃÇ¿ÉÄÜ»áʹÓøü¼ÓÈÝÒ×Àí½âµÄ·ÃÎÊ·½Ê½È磺/people/¹ÍÔ±Ãû.aspx¡£ÕâÀï¾ÍÓÐÁËÒ»¸öÍøÖ·ÖØÐ´µÄ°¸Àý£ºµ±½ÓÊÕµ½¶Ô/people/ScottMitchell.aspxµÄÇëÇóµÄʱºò£¬ÎÒÃǾ͵ÃʹÓÃÍøÖ·ÖØÐ´Ê¹µÃ¶Ô¸ÃÒ³ÃæµÄÇëÇó±»ÖØÐ´Ö¸Ïòµ½ÏÈǰʹÓõÄ/info/employee?EmpID=1001µØÖ·¡£

1.10. Ê¹ÓÃHttpModuleÀ´µ÷ÓÃÍøÖ·ÖØÐ´
ÔÚASP.NETÒ»¼¶À´Ö´ÐÐÍøÖ·ÖØÐ´£¬¼È¿ÉÒÔʹÓÃHttpHandler£¬Ò²¿ÉÒÔʹÓÃHttpModule¡£µ±Ê¹ÓÃHttpModuleµÄʱºò£¬±ØÐë¾ö¶¨Èç¹û¸ÃÍøÖ·ÐèÒª±»ÖØÐ´µÄ»°£¬¾¿¾¹Ó¦¸ÃÔÚÕû¸öÇëÇóµÄÉúÃüÖÜÆÚÆÚ¼äµÄÄÇÒ»¸öµãÀ´Ê¹Óá£Õ§Ò»¿´×ÅÓÐЩÎä¶Ï£¬µ«ÊÇÕâ¸ö¾ö¶¨ÒÔÖØ´ó¶øÇÒ΢ÃîµÄ·½Ê½Ó°Ïìµ½ÄãµÄÓ¦ÓóÌÐò¡£Ö®ËùÒÔ×÷³ö¶ÔÍøÖ·ÖØÐ´µãµÄÑ¡ÔñÊÇÒòΪÄÚǶµÄASP.NET HttpModuleʹÓÃRequest¶ÔÏóµÄÊôÐÔÖµÀ´Íê³É×Ô¼ºµÄ¹¤×÷£¨»ØÒäÒ»ÏÂÖØÐ´Â·¾¶¶ÔRequest¶ÔÏóµÄÊôÐÔÖµµÄ¸Ä±ä£©£¬ÕâЩÄÚǶHttpModuleºÍÏàӦʼþµÄÃÜÇйØÏµÁоÙÈçÏ£º

HttpModule ʼþ ¼ò½é
FormsAuthenticationModule AuthenticateRequest ÅжÏÓû§ÊÇ·ñÒÑͨ¹ý±íµ¥ÊÚȨ·½Ê½»ñÈ¡ÊÚȨ£¬Èç¹ûûÓеϰÔò½«Óû§Öض¨Ïòµ½Ö¸¶¨µÄµÇÂ¼Ò³Ãæ
FileAuthorizationModule AuthorizeRequest µ±Ê¹ÓÃWindowsÊÚȨ·½Ê½µÄʱºò£¬¸ÃHttpModuleÅжϲ¢È·¶¨¸ÃMicrosoft WindowsÕÊ»§ÊÇ·ñ¶ÔÆäÇëÇóµÄ×ÊÔ´ÓµÓÐ×ã¹»µÄȨÏÞ
UrlAuthorizationModule AuthorizeRequest ¼ì²é²¢È·ÈÏÇëÇóÕßÊÇ·ñ¶ÔËù·ÃÎʵÄÍøÖ·ÓµÓÐȨÏÞ¡£¸ÃUrlÊÚȨ¿ÉÒÔÔÚweb.configÎļþµÄ<authorization>ºÍ<location>ÔªËØÖÐÅäÖÃ

»ØÏëÒ»ÏÂBeginRequestʼþÔÚAuthenticateRequestʼþ֮ǰÒý·¢£¬¶øAuthenticateRequestʼþÓÖÔÚAuthorizeRequestʼþ֮ǰÒý·¢¡£
ʵÏÖÍøÖ·ÖØÐ´µÄÒ»¸ö½ÏΪ°²È«µÄ³¡ºÏ¾ÍÊǰÑËü·ÅÔÚÔÚBeginRequestʼþÖÐÖ´ÐУ¬ÕâÒâζ×ÅÈç¹ûÒªÖ´ÐÐÍøÖ·ÖØÐ´µÄ»°£¬ÔÚÖÚ¶àÄÚǶHttpModuleÔËÐеÄʱºòËûÒѾ­Íê³ÉÁË¡£ÕâÖÖ;¾¶µÄ×îÖÕÓÃ;ÁÜÀ쾡ÖµØÌåÏÖÔÚ±íµ¥ÑéÖ¤ÉÏ¡£µ±Óû§·ÃÎÊÊÜÏÞ×ÊÔ´µÄʱºò£¬Èç¹û֮ǰʹÓÃÁË±íµ¥ÑéÖ¤£¬Ëû»á×Ô¶¯±»Öض¨Ïòµ½Ö¸¶¨µÄµÇÂ¼Ò³Ãæ£¬Ôڳɹ¦µÇ¼֮ºó£¬Óû§±»Öض¨Ïò»ØÏÈǰÊÔͼ·ÃÎʵÄÊÜÏÞÖÆÒ³Ãæ¡£
Èç¹û°ÑÍøÖ·ÖØÐ´·ÅÔÚBeginRequestʼþ»òÕßAuthenticateRequestʼþÖУ¬ÔÚµÇÂ¼Ò³ÃæÉÏÖ´ÐÐÌá½»ºó£¬¸ÃÒ³Ãæ»á½«Óû§Öض¨Ïòµ½ÍøÖ·ÖØÐ´Ö¸¶¨µÄÒ³Ãæ¡£¼Ù¶¨µ±Óû§ÔÚä¯ÀÀÆ÷ÉÏÇÃÈë/people/ScottMitchell.aspxµØÖ·£¬¸ÃµØÖ·ÊÇÒª±»Öض¨Ïòµ½/info/employee.aspx?EmpID=1001µÄ£¬Èç¹û¸ÃWebÓ¦ÓóÌÐòÉ趨ʹÓÃ±íµ¥ÑéÖ¤£¬µ±Óû§¿ªÊ¼·ÃÎÊ/people/ScottMitchell.aspxµÄʱºò£¬¸ÃÍøÖ·½«ÖØÐ´Ö¸Ïò/info/employee.aspx?EmpID=1001£¬½Ó×ÅForumAuthenticationModuleÆô¶¯£¬Èç¹ûÐèÒªµÄ»°½«Óû§Öض¨Ïòµ½µÇÂ¼Ò³Ãæ£¬Óû§µÇ¼ºóÖØ¶¨Ïòµ½µÄÒ³Ãæ½«ÊÇ/info/employee.aspx?EmpID=1001£¬ÕâÒ²ÊÇ×Ô´ÓFormAuthenticationModuleÆô¶¯ÔËÐÐʱËù·¢³öÇëÇóµÄÒ³Ãæ¡£
ͬÉÏÀàËÆ£¬µ±°ÑÍøÖ·ÖØÐ´·ÅÔÚBeginRequestʼþ»òÕßAuthenticateRequestʼþÖÐÔËÐеÄʱºò£¬UrlAuthenticationModuleÒ²·¢ÏÖÁËÍøÖ·ÖØÐ´Ö¸ÏòµÄÍøÖ·£¬ÕâÒâζ×ÅÈç¹ûÔÚ¸ÃÓ¦ÓóÌÐòµÄweb.configÎļþÖÐ<location>½ÚÎªÌØ¶¨µÄÍøÖ·ÅäÖÃÌØ¶¨µÄÊÚȨµØÖ·µÄ»°£¬ÄãµÃÒýÓÃÖØÐ´ËùÖ¸ÏòµÄÍøÖ·¡£
ΪÁ˽â¾öÕâ¸ö΢ÃîµÄÎÊÌ⣬һ¸ö¿ÉÄܾÍÊǰÑÍøÖ·ÖØÐ´·ÅÔÚAuthorizeRequestʼþÖÐÔËÐУ¬µ«ÊÇÔÚʹÓÃÕâÖÖ·½·¨½â¾öURLÊÚȨºÍ±íµ¥ÊÚȨµÄÒ쳣ʱÓÖÒýÈëÁËÒ»¸öеÄȱÏÝ£ºÎļþÊÚȨ»áʧЧ¡£µ±Ê¹ÓÃWindowsÑéÖ¤µÄʱºò£¬FileAuthorizationModule¼ì²é²¢ÑéÖ¤ÒÑͨ¹ýÑéÖ¤µÄÓû§ÊÇ·ñÓµÓÐ×ã¹»µÄȨÏÞ·ÃÎÊÌØ¶¨µÄASP.NETÒ³Ãæ¡£
¼Ù¶¨ÓÐһȺÓû§²¢Ã»ÓÐWindows¼¶±ðµÄ·ÃÎÊȨÏÞ·ÃÎÊC:\inetpub\wwwroot\info\employee.aspx£¬µ±ÕâЩÓû§ÊÔͼ·ÃÎÊ/info/employee.aspx?EmpID=1001µÄʱºò£¬ËûÃÇ»áµÃµ½Î´ÊÚȨµÄ´íÎó£¬Èç¹ûÎÒÃǰÑÍøÖ·ÖØÐ´·Åµ½AuthenticateRequestʼþÖÐÔËÐУ¬µ±FileAuthorizationModuleÑéÖ¤¸Ã°²È«ÐÔÉèÖõÄʱºò£¬ËûÈÔÈÎÈËΪ±»ÇëÇóµÄÎļþÊÇ/people/ScottMitchell.aspx£¬¶øÕâʱ¸ÃÍøÖ·ÒѾ­±»ÖØÐ´ÁË£¬Òò´ËFileAuthorizationModule»áÖ±½Ó·ÅÐУ¬ÈÃÓû§¿´µ½ÁËÍøÖ·ÖØÐ´Ö¸ÏòµÄÄÚÈÝ£º/info/employee.aspx?Empid=1001¡£
ÄÇôʲôʱºòÔÚHttpModuleµ÷ÓÃÍøÖ·ÖØÐ´ºÏÊÊÄØ£¿Ëû¾ö¶¨ÓÚËùʹÓõÄÑéÖ¤·½Ê½£¬µ±È»Èç¹û²»Ê¹ÓÃÑéÖ¤·½Ê½µÄ»°£¬ÄÇôÎÞÂÛÊÇÔÚBeginRequestʼþ¡¢AuthenticateRequestʼþ»¹ÊÇAuthorizeRequestʼþÖе÷ÓÃÍøÖ·ÖØÐ´Ã»Óжà´óÇø±ð£¬Èç¹ûʹÓÃ±íµ¥ÑéÖ¤·½Ê½²¢ÇÒ²»Ê¹ÓÃWindowsÑéÖ¤·½Ê½µÄ»°£¬°ÑÍøÖ·ÖØÐ´·ÅÈëAuthorizeRequestʼþίÍÐÖе÷Óüȿɣ¬Èç¹ûʹÓÃWindowsÑéÖ¤·½Ê½µÄ»°£¬°ÑÕâÏÄÜ·ÅÈëBeginRequestʼþ»òÕßAuthenticateRequestʼþµ÷ÓþÍÐÐÁË¡£

1.11. Ê¹ÓÃHttpHandlerÀ´µ÷ÓÃÍøÖ·ÖØÐ´
³ýÁËÉÏÃæËùÊö·½·¨Íâ£¬ÍøÖ·ÖØÐ´Ò²¿ÉÒÔ·ÅÈëHttpHandler»òÕßHttpHandlerFactoryÖе÷Óá£HttpHandlerÊÇÒ»¸ö¸ºÔðÕë¶ÔÌØ¶¨ÇëÇóÉú³ÉÏàÓ¦ÄÚÈݵÄÀ࣬¶øHttpHandlerFactory·µ»ØÒ»¸öHTTPµÄʵÀý£¬¸ÃʵÀýÕë¶ÔÌØ¶¨ÇëÇóÉú³ÉÏàÓ¦ÄÚÈÝ¡£
±¾½Ú½«×ÅÑÛÓÚΪÕâЩASP.NETÒ³Ãæ´´½¨Ò»¸öÍøÖ·ÖØÐ´µÄHttpHandlerFactory¡£´´½¨HttpHandlerFactory±ØÐëʵÏÖIHTTPHandlerFactory½Ó¿Ú£¬Ëü°üÀ¨Ò»¸öGetHandler()·½·¨¡£ASP.NETÒýÇæÔÚ³õʼ»¯ÕâЩHttpModuleºó×ö³ö¾ö¶¨Õë¶Ô¸ÃÇëÇóµ÷ÓÃÏàÓ¦µÄHttpHandler»òÕßHttpHandlerFactory£¬ÔÚµ÷ÓÃHttpHandlerFactoryµÄʱºò£¬Õë¶Ô¸ÃWebÇëÇóÒÔ¼°ËæÍ¬µÄÆäËûÐÅÏ¢µÄHttpContextÖо­¹ýµÄµÄHttpHandlerFactoryµÄGetHandler()·½·¨½«±»ASP.NETÒýÇæµ÷Óã¬HttpHandlerFactory±ØÐë·µ»ØÒ»¸öÄÜίÍиÃÇëÇóµÄ¶ÔÏ󣬲¢ÇҸöÔÏóÒªÄÜʵÏÖIHttpHandler½Ó¿Ú¡£
Ҫͨ¹ýÒ»¸öHttpHandlerÀ´µ÷ÓÃÍøÖ·ÖØÐ´£¬¿ÉÒÔÏÈ´´½¨Ò»¸öHttpHandlerFactory£¬ËüµÄGetHandler()·½·¨¼ì²éËùÇëÇóµÄÍøÖ·²¢¾ö¶¨ÊÇ·ñÐèÒªµ÷ÓÃÍøÖ·ÖØÐ´¡£Èç¹ûÒªµ÷ÓÃÍøÖ·ÖØÐ´µÄ»°Ôòµ÷ÓÃǰÎÄËùÊöµÄÒÑͨ¹ý¼ì²éµÄHttpContext¶ÔÏóµÄRewritePath()·½·¨¡£×îºó¸ÃHttpHandlerFactory·µ»ØÒ»¸öÓÉÀàSystem.Web.UI.PageParserµÄGetCompiledInstance()·½·¨·µ»ØµÄHttpHandler¡££¨ÕâÓëÄÚǶÓÚASP.NETÒ³ÃæµÄHttpHandlerFactory£¨PageHandlerFactory£©µÄ¹¤×÷Ô­ÀíÏàͬ¡££©
ÔÚËùÓÐHttpModule±»³õʼ»¯ºó£¬HttpHandlerFactory¾Í¿ªÊ¼±»ÊµÀý»¯¡£°ÑÍøÖ·ÖØÐ´·ÅÔÚÕâЩʼþ³¡ËùµÄ×îºóÒ»¸öÀïÍ·µ÷ÓõÄʱºò£¬Ò²»áÅöµ½ÏàͬµÄÎÊÌ⣺ÎļþÊÚȨ½«»áʧЧ¡£Èç¹û·ÇÒªÒÀÀµÓÚWindowsÑéÖ¤ºÍÎļþÑéÖ¤µÄʱºò£¬Äã¿ÉÄܵÃʹÓÃHttpModuleÀ´µ÷ÓÃÍøÖ·ÖØÐ´ÁË¡£
ÏÂÒ»ÕÂÎÒÃÇ×ÅÑÛÓÚÈçºÎ¹¹½¨Ò»¸ö¿ÉÖØÓõÄÍøÖ·ÖØÐ´ÒýÇæ£¬Ê¹ÓÃÏÂÎÄËùÌáµÄÕâЩʾÀý¾ùÒÔÕæÊµ°¸Àý×÷Ϊ²ÎÕÕ£¬ÔÚ×÷ÕßÖ÷Ò³ÉÏÌṩÏÂÔØ¡£ÏÈÓÃÓÃÒ»¸ö¼òµ¥µÄÍøÖ·ÖØÐ´µÄÀý×ÓÀ´Ì½ÌÖÈçºÎʵÏÖÍøÖ·ÖØÐ´£¬½ô½Ó׎«ÀûÓÃÍøÖ·ÖØÐ´ÒýÇæÖÐÕýÔò±í´ïʽµÄÇ¿´ó´¦ÀíÄÜÁ¦À´Õ¹Ê¾ÕæÕý¡°Òþ±Î¡±µÄÍøÖ·ÖØÐ´¼¼Êõ£¡

1.12. Ê¹ÓÃÍøÖ·ÖØÐ´ÒýÇæÊµÏÖ¼òµ¥µÄÍøÖ·ÖØÐ´
ΪÁ˱ãÓÚÔÚWebÓ¦ÓóÌÐòÖÐʵÏÖÍøÖ·ÖØÐ´£¬ÎÒ¹¹½¨ÁËÒ»¸öÍøÖ·ÖØÐ´ÒýÇæ£¬¸ÃÒýÇæÌṩÏÂÁй¦ÄÜ£º
 ¿ÉÒÔÔÚweb.configÎļþÖÐÎªÒ³Ãæ¿ª·¢Õß¶¨ÒåÆäËùʹÓõÄÍøÖ·ÖØÐ´ÒýÇæµÄ¹æÔò£»
 Í¨¹ýʹÓÃÕýÔò±í´ïʽÀ´Ê¹ËùÖÆ¶¨µÄÍøÖ·ÖØÐ´¹æÔò¾ßÓиü¼ÓÇ¿´óµÄÖØÐ´ÄÜÁ¦£»
 Äܹ»Í¨¹ý¼òµ¥ÅäÖü´¿ÉÔÚHttpModuleºÍHttpHandlerÖÐʹÓÃÍøÖ·ÖØÐ´¡£
±¾½Úֻ̽ÌÖͨ¹ýHttpModuleÀ´ÊµÏÖÍøÖ·ÖØÐ´£¬ÒªÁ˽âÈçºÎͨ¹ýHttpHandlerÀ´ÊµÏÖÍøÖ·ÖØÐ´ÇëÏÂÔØ±¾ÎÄÌṩµÄ´úÂë¡£

1.12.1. ÉèÖÃÍøÖ·ÖØÐ´ÒýÇæµÄÅäÖÃÐÅÏ¢
ÎÒÃÇÀ´Ì½ÌÖÒ»ÏÂÔÚweb.configÖÐÍøÖ·ÖØÐ´¹æÔòµÄÅäÖýڡ£Ê×ÏȱØÐëÔÚweb.configÎļþÖÐÖ¸³öÊÇ·ñÐèÒªÔÚHttpHandler»òÕßHttpModuleÖе÷ÓÃÍøÖ·ÖØÐ´£¬ÔÚweb.configÖУ¬ÏÂÎÄÒѾ­°üº¬ÁËÁ½¸öÒѾ­±»×¢Ê͵ôµÄÅäÖýڣº

<!--
<HttpModules>
    <add type="URLRewriter.ModuleRewriter,URLRewriter" name="ModuleRewriter"/>
</HttpModules>
-->

<!--
<httpHandlers>
 <add verb="*" path="*.aspx" type="URLRewriter.RewriterFactoryHandler,URLRewriter" />
</httpHandlers>
-->

±»×¢Ê͵ôµÄ<HttpModules>ΪÅäÖÃʹÓÃHttpModuleµ÷ÓÃÍøÖ·ÖØÐ´£»×¢Ê͵ôµÄ<httpHandler>ΪÅäÖÃʹÓÃHttpHandlerµ÷ÓÃÍøÖ·ÖØÐ´¡£
²»ÂÛÅäÖÃʹÓÃ<HttpModules>»¹ÊÇ<httpHandlers>µ÷ÓÃÍøÖ·ÖØÐ´£¬³ý´ËÖ®Í⻹ÐëÅäÖÃÍøÖ·ÖØÐ´¹æÔò£¬Ò»ÌõÖØÐ´¹æÔò°üÀ¨Á½Ïî×Ö·û´®£ºÇëÇóURLÖеIJéÕÒģʽºÍÕë¶Ô¸ÃģʽµÄÆ¥Åä³É¹¦ºóµÄÌæ»»×Ö·û´®¡£¸ÃÐÅÏ¢ÔÚweb.configÎļþÖÐÓÃÏÂÁбêÇ©ÃèÊö£º

<RewriterConfig>
    
<Rules>
        
<RewriterRule>
            
<LookFor>pattern to look for</LookFor>
            
<SendTo>String to replace pattern with </SendTo>
        
</RewriterRule>
        
<RewriterRule>
            
<LookFor>pattern to look for</LookFor>
            
<SendTo>String to replace pattern with </SendTo>
        
</RewriterRule>
        
    
</Rules>
</RewriterConfig>

ÿһÌõ¹æÔò¶¼ÓÃÒ»¸ö<RewriterRule>ÔªËØ±íʾ£¬ÒÔ<LookFor>½Ú±íʾ²éѯģʽ£¬µ±²éѯģʽ·¢ÏÖÆ¥Åä×Ö·û´®Ê±±ãÓÃ<SendTo>½Ú±íʾµÄ×Ö·û´®½øÐÐÌæ»»¡£ÕâЩ¹æÔò´ÓÉϵ½Ï½øÐвéѯƥÅ䣬Èç¹ûÕÒµ½Ò»¸öÆ¥ÅäÔò°´´Ë¹æÔòÖ´ÐÐÍøÖ·ÖØÐ´£¬²¢ÇÒÍ£Ö¹²éÕÒ¡£
ÅäÖÃ<LookFor>½ÚҪʹÓÃÕýÔò±í´ïʽÀ´½øÐÐ×Ö·û´®Æ¥ÅäºÍÌæ»»¡££¨ÔÚ´ËÎÒÃǾÙÒ»¸öÀý×ÓÀ´ËµÃ÷ÈçºÎʹÓÃÕýÔò±í´ïʽÀ´¶Ô×Ö·û´®½øÐÐÆ¥ÅäºÍÌæ»»¡££©¼ÈÈ»¸Ã²éÕÒģʽÊÇÒ»¸öÕýÔò±í´ïʽ£¬ÄÇôҪעÒâ±Ü¿ª¶ÔÕýÔò±í´ïʽ±£Áô×Ö·û´®µÄÖ±½ÓʹÓᣣ¨ÕýÔò±í´ïʽµÄ±£Áô×Ö·û´®°üÀ¨ÓУº.£¬?£¬^£¬$£¬µÈµÈ£¬¿ÉÒÔͨ¹ýÔÚÇ°Ãæ¼ÓÉÏÒ»¸ö·´Ð±ÏßÀ´ÒýÓÃÕâЩ±£Áô×Ö·û£¬ÀýÈç\.±íʾÒýÓÃÒ»¸ö¾äµã£©
1.12.2. Ê¹ÓÃHttpModuleÀ´Ö´ÐÐÍøÖ·ÖØÐ´

´´½¨Ò»¸öHttpModuleºÜ¼òµ¥£¬Ö»Òª´´½¨Ò»¸öʵÏÖIHttpModule½Ó¿ÚµÄÀ࣬¸ÃIHttpModule½Ó¿Ú¶¨ÒåÁËÁ½¸ö·½·¨£º
 Init(HttpApplication)£¬¸Ã·½·¨ÔÚHttpModule³õʼ»¯Ê±Òý·¢£¬Í¨¹ý¸Ã·½·¨ÎªHttpApplicationʼþµ÷ÓÃÏàÓ¦µÄʼþίÍУ»
 Dispose()£¬µ±ÏàÓ¦ÇëÇó´¦Àí½áÊø²¢·¢ËÍ»ØIISµ÷Óô˷½·¨£¬Í¨¹ý´Ë·½·¨Ö´ÐÐ×îÖÕËùÓеÄÇåÀíºÍ»ØÊÕ³ÌÐò¡£
ΪÁ˸ü¼Ó·½±ãµØÎªÍøÖ·ÖØÐ´´´½¨HttpModule£¬´ÓÒ»¿ªÊ¼ÎҾʹ´½¨Ò»¸ö³éÏóµÄ»ùÀࣨBaseModuleRewriter£©£¬¸ÃÀàʵÏÖÁËIHttpModule½Ó¿Ú¡£ÔÚInit(HttpApplication)ʼþÖУ¬Ëüͨ¹ýBaseModuleRewriter_AuthorizeRequest·½·¨Òý·¢ÁËHttpApplicationµÄAuthorizeRequestʼþ£¬¸ÃBaseModuleRewriter_AuthorizeRequest·½·¨Í¨¹ý¸ÃÀàµÄRewrite()·½·¨ÖØÐ´´«Èë²ÎÊýHttpApplication¶ÔÏóµÄÄÚ²¿ÇëÇóÐéÄâ·¾¶£¨Path£©¡£ÔÚBaseModuleRewriter¶ÔÏóÖУ¬¸ÃRewrite()·½·¨ÊdzéÏóµÄ£¬²¢ÇÒûÓÐʵ¼ÊÄÚÈÝ£¬µ«Ôڼ̳Ð×Ô¸ÃÀàµÄ¶ÔÏóÖбØÐëÖØÔØRewrite()·½·¨²¢Îª¸Ã·½·¨Ìṩʵ¼ÊÄÚÈÝ¡£
ͨ¹ý¶Ô¸Ã»ùÀàµÄ¼Ì³Ð£¬ËùÓÐÐèÒª×öµÄ¹¤×÷¾ÍÊÇ´´½¨Ò»¸ö¼Ì³Ð×ÔBaseModuleRewriterµÄÀà£¬ÖØÔØRewrite()·½·¨²¢Ôڸ÷½·¨ÖÐÌí¼ÓÍøÖ·ÖØÐ´Âß¼­´úÂë¡£ÏÂÎÄÁгöBaseModuleRewriter´úÂ룺

public abstract class BaseModuleRewriter : IHttpModule
{
    
public virtual void Init(HttpApplication app){
        
// WARNING!  This does not work with Windows authentication!
        
// If you are using Windows authentication, 
        
// change to app.BeginRequest
        app.AuthorizeRequest += new EventHandler(this.BaseModuleRewriter_AuthorizeRequest);
    }


    
public virtual void Dispose() {}

    
protected virtual void BaseModuleRewriter_AuthorizeRequest(object sender, EventArgs e){
        HttpApplication app 
= (HttpApplication) sender;
        Rewrite(app.Request.Path, app);
    }


    
protected abstract void Rewrite(string requestedPath, HttpApplication app);
}

×¢Ò⣺¸ÃBaseModuleRewriterÀà½«ÍøÖ·ÖØÐ´·ÅÔÚAuthorizeRequestʼþÖе÷Óã¬Èç¹ûҪʹÓÃWindowsÑéÖ¤²¢Ê¹ÓÃÎļþÑé֤ģʽʱÇëÐ޸ĴúÂë½«ÍøÖ·ÊÚȨ·ÅÔÚBeginRequest»òÕßAuthenticateRequestʼþÖС£
ModuleRewriter¼Ì³Ð×ÔBaseModuleRewriter£¬²¢ÕæÕýÒâÒåµØÊµÏÖÁËÍøÖ·ÖØÐ´µÄ²Ù×÷£¬¸ÃÀà½ö°üº¬Ò»¸öÖØÔØÁ˵ķ½·¨Rewrite()£¬ÆäÄÚÈÝÈçÏÂÎÄËùʾ£º

protected override void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
    
// get the configuration rules
    RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules;
    
// iterate through each rule
    for(int i = 0; i < rules.Count; i++)
    
{
        
// get the pattern to look for, and 
        
// Resolve the Url (convert ~ into the appropriate directory)
        string lookFor = "^" + 
        RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) 
+ "$";
        
// Create a regex (note that IgnoreCase is set)
        Regex re = new Regex(lookFor, RegexOptions.IgnoreCase);
        
// See if a match is found
        if (re.IsMatch(requestedPath))
        
{
            
// match found - do any replacement needed
            string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo));
            
// Rewrite the URL
            RewriterUtils.RewriteUrl(app.Context, sendToUrl);
            
break;      // exit the for loop
        }

    }

}

¸ÃRewriter()·½·¨ÒÔ»ñÈ¡web.configÎļþÖеÄÍøÖ·ÖØÐ´¹æÔòµÄÉèÖÃΪÆðʼ£¬Ëüͨ¹ýÑ­»··ÃÎʸ÷ÌõÍøÖ·ÖØÐ´¹æÔò£¬Ã¿´Î¾ù»ñÈ¡µ±Ç°¹æÔòÖеÄLookForÊôÐÔ£¬ÓÃÕýÔò±í´ïʽÑéÖ¤²¢ÅжÏÊÇ·ñ²éÕÒÊÇ·ñ¶Ôµ±Ç°ÇëÇóµÄÍøÖ·ÊÇ·ñÓÐÆ¥Åä¡£
Èç¹û·¢ÏÖÒ»ÌõÆ¥Å䣬½«Óõ±Ç°¹æÔòµÄSendToÖµ¶ÔÇëÇóµÄ·¾¶Ö´ÐÐÒ»¸öÕýÔò±í´ïÊ½Ìæ»»£¬Ìæ»»ºóµÄµØÖ·Í¨¹ý²ÎÊýµÄÐÎʽ´«¸øRewriterUtils.RewriteUrl()·½·¨£¬RewriterUtilsÊÇÒ»¸ö°ïÖúÀ࣬ËüÌṩһ¶ÔHttpModuleºÍHttpHandler¶¼¿ÉÒÔʹÓõľ²Ì¬·½·¨£¬RewriterUrl()·½·¨Ö»ÊǼòµ¥µØµ÷ÓÃÁËHttpContext¶ÔÏóµÄRewritePath()·½·¨¡£
×¢Ò⣺ÄãÒѾ­×¢Òâµ½Á˵±Ö´ÐÐÕýÔò±í´ïʽƥÅäºÍÌæ»»µÄʱºòµ÷ÓÃÁËÒ»¸öRewriterUtils.ResolveUrl()·½·¨¡£¸Ã°ïÖú·½·¨¼òµ¥µØÌæ»»ÁËÓ¦ÓóÌÐò·¾¶ÖС°~¡±µÄËùÓÐʵÀý¡£
±¾Îĸ½Â¼ÖÐÌṩËùÓÐÉæ¼°¸ÃÍøÖ·ÖØÐ´ÒýÇæµÄ´úÂëÏÂÔØ£¬ÎÒÃÇÒѾ­Ì½ÌÖÁËÖ÷ÒªµÄ²¿·Ö£¬µ«ÊÇ»¹ÓÐÆäËüһЩ×é¼þÖîÈ罫web.configÎļþÖÐXML¸ñʽ»¯Á˵ÄÍøÖ·ÖØÐ´¹æÔò·´ÐòÁл¯ÖÁÒ»¸ö¶ÔÏóµÄÀඨÒ塢ͨ¹ýHttpHandlerFactoryʵÏÖÍøÖ·ÖØÐ´µÄÀඨÒåµÈ¡£±¾ÎÄ×îºóÈý½Ú½«Í¨¹ýÒ»Ð©ÕæÊµ°¸ÀýÀ´Ì½ÌÖÍøÖ·ÖØÐ´µÄ¼¼Êõ¡£
1.12.3. ÓÃÍøÖ·ÖØÐ´ÒýÇæÊµÏÖ¼òµ¥µÄÍøÖ·ÖØÐ´
ΪÁ˸üºÃµØÊ¾·¶ÍøÖ·ÖØÐ´ÒýÇæµÄÔËÐУ¬ÎÒÃÇÀ´½¨Á¢Ò»¸öASP.NET WebÓ¦ÓóÌÐòÀ´ÊµÏÖ¼òµ¥µÄÍøÖ·ÖØÐ´ÒýÇæ¡£¼Ù¶¨ÎÒÃÇΪһ¼ÒÔÚÏßÏúÊÛ¸÷ÀàÉÌÆ·µÄ¹«Ë¾·þÎñ£¬ÕâЩ²úÆ·»®·ÖΪÒÔÏÂÀà±ð£º
·ÖÀà±àºÅ(CategoryID) ·ÖÀàÃû³Æ(CategoryName)
1 ÒûÁÏ£¨Beverages£©
2 µ÷ζƷ£¨Condiments£©
3 ¹¤ÒÕÆ·£¨Confections£©
4 ÈռDZ¾£¨Diary Products£©
... ...
¼Ù¶¨ÒѾ­½¨Á¢ºÃÒ»¸öÃûΪListProductsByCategoryID.aspxµÄASP.NETÒ³ÃæÎļþ£¬Ëüͨ¹ý²éѯ²ÎÊý»ñȡһ¸ö·ÖÀà±àºÅ£¬²¢¸ù¾Ý´Ë±àºÅ»ñÈ¡ËùÓи÷ÖÀàϵÄËùÓÐÉÌÆ·¡£Èç¹ûÓû§Ïëä¯ÀÀËùÏúÊÛµÄÒûÁÏÀàÉÌÆ·¿ÉÒÔͨ¹ýListProductsByCategoryID.aspx?CategoryID=1À´·ÃÎÊ£¬Èç¹ûÓû§Ïëä¯ÀÀËùÏúÊÛµÄÈռDZ¾ÀàÉÌÆ·¿ÉÒÔͨ¹ýListProductsByCategoryID.aspx?CategoryID=4À´·ÃÎÊ¡£¼Ù¶¨»¹ÓÐÒ»¸öÒ³ÃæListCategories.aspx£¬ËüÁгöËùÓдúÊÛÉÌÆ·µÄ·ÖÀà±àºÅ¡£
ÏÔÈ»ÕâÀï·¢ÏÖÁËÒ»¸öÍøÖ·ÖØÐ´µÄ°¸Àý¡£¶ÔÓÚÓû§À´ËµËûÃÇËùÊäÈëµÄµØÖ·²»¾ßÓÐÈκÎʵ¼ÊÒâÒå²¢ÇÒ²»¾ß±¸ÈκΡ°Òþ±ÎÐÔ¡±£¬µ¹²»ÈçʹÓÃÍøÖ·ÖØÐ´ÒýÇæÈÃÓû§È¥·ÃÎÊ/Products/Baverage.aspxµØÖ·£¬ÏµÍ³½«¸ÃµØÖ·ÖØÐ´µ½ListProductsByCategoryID.aspx?CategoryID=1¡£ÎÒÃÇ¿ÉÒÔÔÚweb.configÎļþÖÐÀ´Íê³ÉÍøÖ·ÖØÐ´ÈÎÎñ£º

<RewriterConfig>
    
<Rules>
        
<!¡ª- Rules for products lister -->
        
<RewriterRule>
            
<LookFor>~/Products/Baverage.aspx</LookFor>
            
<SendToÕýÔò±í´ïʽÑéÖ¤²¢ÅжÏÊÇ·ñ²éÕÒÊÇ·ñ¶Ôµ±Ç°ÇëÇóµÄÍøÖ·ÊÇ·ñÓÐÆ¥Åä¡£
Èç¹û·¢ÏÖÒ»ÌõÆ¥Å䣬½«Óõ±Ç°¹æÔòµÄSendToÖµ¶ÔÇëÇóµÄ·¾¶Ö´ÐÐÒ»¸öÕýÔò±í´ïÊ½Ìæ»»£¬Ìæ»»ºóµÄµØÖ·Í¨¹ý²ÎÊýµÄÐÎʽ´«¸øRewriterUtils.RewriteUrl()·½·¨£¬RewriterUtilsÊÇÒ»¸ö°ïÖúÀ࣬ËüÌṩһ¶ÔHttpModuleºÍHttpHandler¶¼¿ÉÒÔʹÓõľ²Ì¬·½·¨£¬RewriterUrl()·½·¨Ö»ÊǼòµ¥µØµ÷ÓÃÁËHttpContext¶ÔÏóµÄRewritePath()·½·¨¡£
×¢Ò⣺ÄãÒѾ­×¢Òâµ½Á˵±Ö´ÐÐÕýÔò±í´ïʽƥÅäºÍÌæ»»µÄʱºòµ÷ÓÃÁËÒ»¸öRewriterUtils.ResolveUrl()·½·¨¡£¸Ã°ïÖú·½·¨¼òµ¥µØÌæ»»ÁËÓ¦ÓóÌÐò·¾¶ÖС°~¡±µÄËùÓÐʵÀý¡£
±¾Îĸ½Â¼ÖÐÌṩËùÓÐÉæ¼°¸ÃÍøÖ·ÖØÐ´ÒýÇæµÄ´úÂëÏÂÔØ£¬ÎÒÃÇÒѾ­Ì½ÌÖÁËÖ÷ÒªµÄ²¿·Ö£¬µ«ÊÇ»¹ÓÐÆäËüһЩ×é¼þÖîÈ罫web.configÎļþÖÐXML¸ñʽ»¯Á˵ÄÍøÖ·ÖØÐ´¹æÔò·´ÐòÁл¯ÖÁÒ»¸ö¶ÔÏóµÄÀඨÒ塢ͨ¹ýHttpHandlerFactoryʵÏÖÍøÖ·ÖØÐ´µÄÀඨÒåµÈ¡£±¾ÎÄ×îºóÈý½Ú½«Í¨¹ýÒ»Ð©ÕæÊµ°¸ÀýÀ´Ì½ÌÖÍøÖ·ÖØÐ´µÄ¼¼Êõ¡£
1.12.3. ÓÃÍøÖ·ÖØÐ´ÒýÇæÊµÏÖ¼òµ¥µÄÍøÖ·ÖØÐ´
ΪÁ˸üºÃµØÊ¾·¶ÍøÖ·ÖØÐ´ÒýÇæµÄÔËÐУ¬ÎÒÃÇÀ´½¨Á¢Ò»¸öASP.NET WebÓ¦ÓóÌÐòÀ´ÊµÏÖ¼òµ¥µÄÍøÖ·ÖØÐ´ÒýÇæ¡£¼Ù¶¨ÎÒÃÇΪһ¼ÒÔÚÏßÏúÊÛ¸÷ÀàÉÌÆ·µÄ¹«Ë¾·þÎñ£¬ÕâЩ²úÆ·»®·ÖΪÒÔÏÂÀà±ð£º
·ÖÀà±àºÅ(CategoryID) ·ÖÀàÃû³Æ(CategoryName)
1 ÒûÁÏ£¨Beverages£©
2 µ÷ζƷ£¨Condiments£©
3 ¹¤ÒÕÆ·£¨Confections£©
4 ÈռDZ¾£¨Diary Products£©
... ...
¼Ù¶¨ÒѾ­½¨Á¢ºÃÒ»¸öÃûΪListProductsByCategoryID.aspxµÄASP.NETÒ³ÃæÎļþ£¬Ëüͨ¹ý²éѯ²ÎÊý»ñȡһ¸ö·ÖÀà±àºÅ£¬²¢¸ù¾Ý´Ë±àºÅ»ñÈ¡ËùÓи÷ÖÀàϵÄËùÓÐÉÌÆ·¡£Èç¹ûÓû§Ïëä¯ÀÀËùÏúÊÛµÄÒûÁÏÀàÉÌÆ·¿ÉÒÔͨ¹ýListProductsByCategoryID.aspx?CategoryID=1À´·ÃÎÊ£¬Èç¹ûÓû§Ïëä¯ÀÀËùÏúÊÛµÄÈռDZ¾ÀàÉÌÆ·¿ÉÒÔͨ¹ýListProductsByCategoryID.aspx?CategoryID=4À´·ÃÎÊ¡£¼Ù¶¨»¹ÓÐÒ»¸öÒ³ÃæListCategories.aspx£¬ËüÁгöËùÓдúÊÛÉÌÆ·µÄ·ÖÀà±àºÅ¡£
ÏÔÈ»ÕâÀï·¢ÏÖÁËÒ»¸öÍøÖ·ÖØÐ´µÄ°¸Àý¡£¶ÔÓÚÓû§À´ËµËûÃÇËùÊäÈëµÄµØÖ·²»¾ßÓÐÈκÎʵ¼ÊÒâÒå²¢ÇÒ²»¾ß±¸ÈκΡ°Òþ±ÎÐÔ¡±£¬µ¹²»ÈçʹÓÃÍøÖ·ÖØÐ´ÒýÇæÈÃÓû§È¥·ÃÎÊ/Products/Baverage.aspxµØÖ·£¬ÏµÍ³½«¸ÃµØÖ·ÖØÐ´µ½ListProductsByCategoryID.aspx?CategoryID=1¡£ÎÒÃÇ¿ÉÒÔÔÚweb.configÎļþÖÐÀ´Íê³ÉÍøÖ·ÖØÐ´ÈÎÎñ£º

<RewriterConfig>
    
<Rules>
        
<!¡ª- Rules for products lister -->
        
<RewriterRule>
            
<LookFor>~/Products/Baverage.aspx</LookFor>
            
<SendTo>~/ListProductsByCategoryID.aspx?CategoryID=1</SendTo>
        
</RewriterRule>
    
</Rules>
</RewriterConfig>

ºÜÃ÷ÏԵؿ´µ½£¬ËÑË÷Óû§·ÃÎʵÄ·¾¶ÊÇ·ñÆ¥Åä/Products/Baverage.aspx£¬Èç¹ûÆ¥ÅäµÄ»°£¬Ôò½«ÍøÖ·ÖØÐ´µ½/ListProductsByCategoryID.aspx?CategoryID=1¡£
×¢Ò⣺Äã»á·¢ÏÖ<LookFor>½ÚµãÖбÜÃâÖ±½ÓÔÚ¡°Baverage.aspx¡±ÖÐʹÓþäµã¡°.¡±ÊÇÒòΪ<LookFor>½ÚµãµÄÖµÊÇÕýÔò±í´ïʽµÄÆ¥Åäģʽ£¬ÔÚÕýÔò±í´ïʽÖоäµã·ûºÅÊÇÒ»¸öÌØÊâ×Ö·û£¬Ëü±íʾƥÅäÈκÎÒ»¸ö×Ö·û£¬Ò²¾ÍÊÇ˵Èç¹û·ÃÎÊBaverageQaspxʱҲ»á·¢ÉúÆ¥Å䣬ΪÁ˱ÜÃâ·¢ÉúÕâ¸ö¾äµãÒýÆðµÄÆ¥ÅäÎÒÃǵÃÔڸþäµã·ûºÅÇ°Ãæ¼ÓÉÏÒ»¸ö¡°\¡±£¬±íʾÒýÓþäµã·ûºÅ
ͨ¹ý¸Ã¹æÔò¶¨Ò壬µ±Óû§·ÃÎÊ/Products/Baverage.aspxÎļþµÄʱºò£¬ËûÃǽ«¿´µ½´úÊÛµÄÒûÁÏÀàÉÌÆ·ÁбíÐÅÏ¢¡£Í¼3Ϊ·ÃÎÊ/Products/Baverage.aspxµØÖ·Ê±µÄä¯ÀÀÆ÷½ØÍ¼£¬×¢ÒâÔÚä¯ÀÀÆ÷ÖеØÖ·À¸ÉÏÏÔʾµÄÊÇÓû§ÊäÈëµÄ/Products/Baverage.aspxµØÖ·£¬µ«ÊÇʵ¼Ê·ÃÎʵĵØÖ·È´ÊÇÍøÖ·ÖØÐ´ºóµÄ/ListProductsByCategoryID.aspx?CategoryID=1¡££¨ÊÂʵÉÏ£¬ÔÚ·þÎñÆ÷Éϸù±¾¾Í²»´æÔÚ/Products/Baverage.aspxÎļþ£¡£©

ͼÈý£®ÍøÖ·ÖØÐ´ºóµÄ¶ÔÉÌÆ··ÖÀàµÄÇëÇó

ºÍ/Products/Baverage.aspxÀàËÆ£¬ÏÂÒ»²½ÎÒÃÇÌí¼ÓÆäËü·ÖÀàµÄÖØÐ´¹æÔò£¬Ö»Ðè¼òµ¥µØÔÚweb.configÎļþÖÐ<Rules>ÖÐÔÚÌí¼ÓÆäËû<RewriteRule>½Ú¼´¿É¡£¸ÃÑÝʾÍêÕûµÄÖØÐ´¹æÔò¼¯ºÏÇë²Î¿¼ÏÂÔØÎĵµµÄweb.configÎļþÖе͍Òå¡£
ΪÁËÈøÃÍøÖ·¸ü¾ßÓС°Òþ±ÎÐÔ¡±£¬Èç¹ûÈÃÓû§°Ñ/Products/Baverage.aspxºóÃæBaverage.aspxÒ»¶Î½ØÈ¥£¬ÔÚä¯ÀÀÆ÷ÖÐÊäÈë/Products/À´ä¯ÀÀ²úÆ··ÖÀàÁбí»á¸üºÃһЩ¡£Õ§Ò»¿´£¬ÕâÏîÈÎÎñ΢²»×ãµÀ£¬Ö»ÐèÌí¼ÓÒ»ÌõÍøÖ·ÖØÐ´¹æÔò½«/Products/Ó³Éäµ½/ListCategories.aspx¼´¿É¡£È»¶øÕâÀïÓÐÒ»¸ö΢ÃîÖ®´¦£¬Äã±ØÐëÏÈ´´½¨Ò»¸ö/Products/Ŀ¼£¬²¢ÔÚÀïÃæ·ÅÒ»¸ö¿ÕÎļþDefault.aspx¡£
ÒªÈÏʶΪʲôÕâЩ¶îÍâµÄ²½ÖèÊDZØÐëµÄ£¬ÏȻعËÒ»ÏÂǰÎÄ¡£ÍøÖ·ÖØÐ´ÒýÇæÊÇ´¦ÓÚASP.NETÒ»¼¶µÄ£¬Ò²¾ÍÊÇ˵£¬Èç¹ûASP.NETûÓлñµÃ´¦ÀíÇëÇóµÄ»ú»áµÄ»°£¬ÍøÖ·ÖØÐ´ÒýÇæ¾Í²»ÄܶÔÊäÈëµÄÍøÖ·ÇëÇó×÷³öÅжϡ£´ËÍ⣬IIS½öÔÚÇëÇóÎļþ°üº¬ÏàÓ¦À©Õ¹Ãûʱ²Å½«ÇëÇóת½»¸øASP.NETÒýÇæ¡£Èç¹ûÓû§·ÃÎÊ/Products/£¬IIS²¢²»ÖªµÀÆäÀ©Õ¹ÃûÊÇʲô£¬ÓÚÊÇËü¼ì²é¸ÃĿ¼ÏµÄÎļþ¿´ÊÇ·ñ°üº¬ÓÐĬÈÏÊ×Ò³ÎļþÃû£¨Default.aspx,Default.htm,Default.asp,µÈµÈ£¬ÕâЩÎļþÃûÔÚIIS¹ÜÀí¹¤¾ß¶Ô»°¿òÖÐWeb·þÎñÆ÷ÊôÐÔ¶Ô»°¿òÖеÄÎĵµ±êÇ©Öж¨Òå¡££©µ±È»£¬Èç¹û/Products/Ŀ¼²»´æÔڵϰ£¬IIS½«·µ»ØÒ»¸öHTTP 404´íÎó¡£
ËùÒÔÎÒÃÇÐèÒª´´½¨Ò»¸ö/Products/Ŀ¼²¢ÔÚ¸ÃĿ¼Ï¶îÍâ´´½¨Ò»¸ö¿ÕÎļþDefault.aspx£¬IIS»á¼ì²é¸ÃĿ¼ÏµÄÎļþ£¬·¢ÏÖÓÐÒ»¸öĬÈÏÎļþÃûDefault.aspx£¬ÓÚÊǽ«ÇëÇóת½»¸øASP.NET£¬ÕâÑù£¬ÍøÖ·ÖØÐ´ÒýÇæ²ÅÄÜÉúЧ¡£

<RewriterRule>
    
<LookFor>~/Products/Default.aspx</LookFor>
    
<SendTo>~ListCategories.aspx</SendTo>
</RewriterRule>

ͨ¹ý¸Ã¹æÔò£¬Óû§·ÃÎÊ/Products/Default.aspx»òÕß·ÃÎÊ/Products/¶¼¿ÉÒÔ¿´µ½ÈçͼËÄËùʾµÄ²úÆ··ÖÀàÁÐ±í¡£

ͼËÄ.ÔÚÍøÖ·ÉÏÌí¼Ó¡°Òþ±ÎÐÔ¡±

1.12.4.´¦Àí»ØËÍÊý¾Ý
Èç¹ûÒªÖØÐ´µÄÍøÖ·Éϰüº¬ÓзþÎñÆ÷¶ËWeb Form²¢Ö´ÐÐÊý¾Ý»ØËÍ£¬µ±¸ÃWeb Form»ØËÍÊý¾Ýʱ»á±©Â¶³öÕæÊµµÄÍøÖ·£¬Ò²¾ÍÊÇ˵£¬µ±Óû§·ÃÎÊ/Products/Baverage.aspxʱ£¬ä¯ÀÀÆ÷ÉϵØÖ·À¸ÏÔʾµÄÒ²ÊÇ/Products/Baverage.aspx£¬µ«ÊÇʵ¼ÊÉÏÊÇ·ÃÎÊ/ListProdutsByCategoryID.aspx?CategoryID=1µÄÄÚÈÝ£¬Èç¹ûListProductsByCategoryID.aspxÒ³ÃæÖ´ÐÐÁËÊý¾Ý»ØË͵ϰ£¬Óû§±»Êý¾Ý»ØËͶ¨Ïò¸øÔ­Ê¼µÄ/ListProductByCategoryID.aspx?CategoryID=1Ò³ÃæÉÏ£¬¶ø²»ÊÇ/Products/Baverage.aspxÒ³Ãæ¡£ÕâËäÈ»²»ÊÇʲô´óÎÊÌ⣬µ«ÊÇÓû§»á¾õ²ìµ½µã»÷Ò»¸ö°´Å¥Ê±ÍøÖ··¢ÉúÁ˵ı仯£¬ÕâÒ²Ðí»áÁîÈ˲»°²£¬ÒòΪÈç¹û³öÓÚÍøÖ·°²È«µÄ½Ç¶ÈÀ´Ëµ£¬Ö±½Ó°ÑÕæÊµµÄÍøÖ·±©Â¶³öÀ´ÁË¡£
Ö®ËùÒÔ·¢ÉúÕâÖÖÏÖÏóµÄÔ­ÒòÊǵ±Web FormÔÚ³ÊÏÖ֮ʱ¾ÍÃ÷È·µØÉèÖÃÆäactionÊôÐÔΪµ±Ç°Request¶ÔÏóÖÐÎļþ·¾¶µÄÖµ¡£µ±È»£¬ÔÚWeb Form³ÊÏÖ֮ʱ£¬´Ó/Produts/Baverage.aspxµ½/ListProductsByCategoryID.aspx?CategoryID=1µÄÍøÖ·ÖØÐ´¾ÍÒѾ­Ö´ÐÐÍê±ÏÁË£¬ÕâÒâζ×ÅRequest¶ÔÏóËù»ã±¨µÄÊǵ±Ç°Óû§Ëù·ÃÎʵĵØÖ·ÊÇ/ListProductsByCategoryID.aspx?CategoryID=1¡£Õâô¿´À´£¬Ö»ÐèÈø÷þÎñÆ÷¶Ë±íµ¥ÔÚ³ÊÏÖ֮ʱ²»³ÊÏÖactionÊôÐÔ¼´¿É½â¾öÎÊÌâÁË¡££¨¶Ôä¯ÀÀÆ÷À´Ëµ£¬Èç¹û²»ÉèÖÃactionÊôÐԵϰ£¬ÄÇôÔÚÌá½»µÄʱºò½«Ê¹ÓÃÆäĬÈÏÖµ¡££©
È»¶ø²»ÐÒµÄÊǸÃWeb Form²»»áÔÊÐíÄãÖ¸¶¨actionÊôÐÔ£¬Ò²²»»áÔÊÐíÄãͨ¹ýÉèÖÃһЩÊôÐÔÀ´´ïµ½½ûÓóÊÏÖactionÊôÐÔµÄÄ¿µÄ¡£µÃ×ÔÐм̳ÐSystem.Web.HtmlControls.HtmlFormÕâ¸öÀ࣬²¢ÖØÔظÃÀàµÄRenderAttribute()·½·¨£¬Ã÷È·Ö¸³ö¸ÃÀ಻³ÊÏÖactonÊôÐÔ¡£
¸Ðл¼Ì³ÐÕâ¸öÇ¿´óµÄ¹¦ÄÜ£¬Ê¹µÃÎÒÃǺܼòµ¥¾Í»ñÈ¡ÁËHtmlFormÕâ¸öÀàÏÂËùÓеŦÄܶ¨Ò壬ֻÐèÉÙÁ¿¼¸ÐдúÂë¾Í´ïµ½ËùÐèÄ¿µÄ£¬ÍêÕû´úÂëÈçÏÂËùʾ£º

namespace ActionlessForm
{
        
public class Form:System.Web.UI.HtmlControls.HtmlForm
        
{
                
protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)
                
{
                        writer.WriteAttribute(
"name",this.Name);
                        
base.Attributes.Remove("name");

                        writer.WriteAttribute(
"method",this.Method);
                        
base.Attributes.Remove("method");

                        
this.Attributes.Render(writer);

                        
base.Attributes.Remove("action");

                        
if (base.ID!=null)
                        
{
                                writer.WriteAttribute(
"id",this.ClientID);
                        }

                }

        }

}

¶ÔRenderAttributes()·½·¨ÖØÔصĴúÂë°üº¬ÁËÔ­ÀàHtmlFormµÄRenderAttributes()·½·¨È«²¿µÄ´úÂëÄÚÈÝ£¬Ö»ÊǼòµ¥µØÈ¥µôÁËÉèÖÃactionÊôÐÔÕâÒ»½Ú¡££¨ÎҲο¼ÁËLutz RoederµÄReflecterÒ»ÎÄÖÐÀàHtmlFormµÄÔ´´úÂ룩
µ±´´½¨²¢±àÒëÁËÕâ¸öÀàºó£¬½«ÆäÌí¼Óµ½ÒýÓÃĿ¼¼´¿ÉÔÚ¸ÃASP.NET WebÓ¦ÓóÌÐòÖÐʹÓá£ÎªÁ˽«Ô­ÓÐHtmlFormÀàÌæ»»£¬Ö»Ðè¼òµ¥µØÔÚÒ³Ãæ¶¥²¿Ìí¼ÓÏÂÁдúÂ룺

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm"%>

È»ºó½«<Form runat=¡±server¡±>±êÇ©Ìæ»»Îª

<skm:Form id="Form1" method="post" runat="Server">

²¢½«½áÊø±ê¼Ç</Form>Ìæ»»Îª

<skm:Form>

Äã¿ÉÒԲ鿴¸ÃÎĵµÏà¹ØÏÂÔØÖеÄListProductsByCategoryID.aspxÎļþÖеÄ×Ô¶¨ÒåWeb Form£¬¸ÃÏÂÔØÒѾ­ÌṩÁËÍêÕûµÄVisual Studio.NETÏîÄ¿Îļþ°ü¡£
×¢Ò⣺Èç¹ûÄã´òËã½øÐÐÍøÖ·ÖØÐ´µÄµØÖ·²»Ö´ÐÐÊý¾Ý»ØËÍ£¬ÔòûÓбØÒªÊ¹ÓøÃ×Ô¶¨ÒåWeb FormµÄÀà¡£

1.13. ´´½¨ÕæÕý¡°Òþ±Î¡±µÄÍøÖ·
ÉÏÒ»½Ú¼òµ¥ÍøÖ·ÖØÐ´µÄʾÀýչʾÁËÈçºÎͨ¹ýеÄÍøÖ·ÖØÐ´¹æÔòÀ´ÇáËɵØÅäÖÃÍøÖ·ÖØÐ´ÒýÇæ£¬±¾½Ú½«Í¨¹ý³öÖÚµÄÕýÔò±í´ïʽÀ´Õ¹Ê¾ÍøÖ·ÖØÐ´µÄÇ¿´óÍþÁ¦¡£
ʱÏÂÕýÔÚÁ÷ÐÐBlog£¬ºÜ¶àÈ˶¼ÓµÓÐÒ»¸ö×Ô¼ºµÄBlog¡£²»ÂÛÄãÊÇ·ñ¶ÔBlog¸Ðµ½Ä°Éú£¬ËûÃÇÕýÔÚ²»¶ÏµØ¸üÐÂ×Ô¼ºµÄBlogÒ³Ãæ£¬ÕâÐ©Ò³Ãæ¾ÍÏñÒ»¸ö¸öÈËÈռDZ¾Ò»Ñù¡£´ó¶àÊýBlogerÖ»ÊǼòµ¥µØ¼Ç¼ÿÌì·¢ÉúµÄÊÂÇ飬ҲÓÐһЩ¾Û½¹ÓÚijһÖ÷Ì⣬±ÈÈçÓ°ÆÀ¡¢ÇòÃÔ×éÖ¯¡¢µçÄÔ¼¼ÊõµÈ¡£
Blog¿ÉÒÔÔÚÈκεصãÓÉ×÷Õß½øÐиüУ¬¸üдÎÊý¿ÉÒÔÊÇÒ»Ìì¶à´Î£¬Ò²¿ÉÒÔÊÇÒ»ÖÜÒ»Á½´Î¡£ÔÚBlogÒ³ÃæÉÏÖ»ÏÔʾ×î½ü10Ìõ¸üУ¬µ«ÊÂʵÉÏËùÓеÄBlogÈí¼þ¶¼ÌṩÁË´æµµ¼Ç¼£¬·Ã¿Í¿ÉÒÔÔĶÁÆäÀúÊ·¼Ç¼¡£ÓÐÁË¡°Òþ±Î¡±µÄÍøÖ·£¬BlogÓ¦ÓóÌÐò½«±äµÃ¸ü¼ÓÇ¿´ó¡£¼Ù¶¨Äãͨ¹ý/2004/02/14.aspxÀ´²éѯ×Ô¼ºµÄBlogÉϵÄÎÄÕ£¬Äã»áΪÔĶÁµ½2004Äê2ÔÂ14ÈÕµÄBlog¸Ðµ½¾ªÑÈÂ𣿴ËÍâÄã¿ÉÄÜΪÁË·ÃÎÊ2004Äê2ÔÂËùÓеÄBlog¶ø½«¸ÃµØÖ·²Ã¼õΪ/2004/02/£¬Òª·ÃÎÊ2004ÄêËùÓеÄBlog£¬Äã¿ÉÄÜ»áÊÔ×ÅÈ¥·ÃÎÊ/2004/¡£
ÔÚά»¤Ò»¸öBlogµÄʱºò£¬Èç¹û½«ÕâÖÖ¾ßÓС°Òþ±ÎÐÔ¡±µÄÍøÖ·Ìṩ¸øÓû§½«»á¸üºÃ¡£Êµ¼ÊÉϺܶàBlogÒýÇæ¶¼ÌṩÁËÕâÖÖÍøÖ·ÖØÐ´µÄ¹¦ÄÜ£¬ÏÖÔÚÀ´¿´¿´ÕâЩÊÇÈçºÎͨ¹ýÍøÖ·ÖØÐ´ÊµÏֵġ£
Ê×ÏÈ£¬ÎÒÃÇÐèÒªÒ»¸öÒ³ÃæÄܹ»·Ö±ð°´ÕÕÄê¡¢Ô¡¢ÈÕ·Ö±ðÏÔʾBlogµÄÄÚÈÝ¡£¼Ù¶¨ÏÖÔÚÒѾ­×öºÃÁËÒ»¸öÒ³ÃæÎļþShowBlogContent.aspx£¬ËüÄÜ·Ö±ð»ñÈ¡Äê¡¢Ô¡¢ÈյIJéѯ²ÎÊý£¬Òª²é¿´2004Äê2ÔÂ14ÈÕËù·¢µÄÌû×Ó£¬ÎÒÃÇ¿ÉÒÔ·ÃÎÊ/ShowBlogContent.aspx?year=2004&month=2&day=14£¬Òªä¯ÀÀ2004Äê2ÔµÄÊý¾Ý¿ÉÒÔ·ÃÎÊ/ShowBlogContent.aspx?year=2004&month=2£¬Òª²éѯ2004ÄêËùÓÐÊý¾Ý¿ÉÒÔ·ÃÎÊ/ShowBlogContent.aspx?year=2004¡££¨ÔÚÏÂÔØÎļþÖÐÌṩShowBlogContent.aspxÔ´´úÂë¡££©
È»ºó£¬µ±Óû§·ÃÎÊ/2004/02/14.aspxʱ£¬ÎÒÃÇÐèÒª½«Ëû·ÃÎʵÄÍøÖ·ÖØÐ´µ½/ShowBlogContent.aspx?year=2004&month=2&day=14ÉÏ¡£ÕâÀïÐèÒªÖÆ¶¨ÈýÌõÍøÖ·ÖØÐ´¹æÔò£ºµ±Ö¸¶¨·ÃÎÊÄêÔÂÈÕʱ¡¢µ±Ö¸¶¨·ÃÎÊÄêÔÂʱºÍµ±Ö¸¶¨·ÃÎÊÄêʱ¡£

<RewriterConfig>
        
<Rules>
                
<!-- Rules for Blog Content Displayer -->
                
<RewriterRule>
                        
<LookFor>~/(d{4})/(d{2})/(d{2}).aspx</LookFor>
                        
<SendTo>~/ShowBlogContent.aspx?year=$1&month=$2&day=$3</SendTo>
                
</RewriterRule>
                
<RewriterRule>
                        
<LookFor>~/(d{4})/(d{2})/Default.aspx</LookFor>
                        
<SendTo><![CDATA[~/ShowBlogContent.aspx?year=$1&month=$2]]></SendTo>
                
</RewriterRule>
                
<RewriterRule>
                        
<LookFor>~/(d{4})/Default.aspx</LookFor>
                        
<SendTo>~/ShowBlogContent.aspx?year=$1</SendTo>
                
</RewriterRule>
        
</Rules>
</RewriterConfig>

ÕâÐ©ÍøÖ·ÖØÐ´¹æÔòչʾÁËÕýÔò±í´ïʽµÄÇ¿´óÍþÁ¦¡£µÚÒ»Ìõ¹æÔò°´ÕÕ(\d{4})/(\d{2})/(\d{2})\.aspxģʽ½øÐвéÕÒ£¬Í¨Ë×µÄ˵£¬Ëü²éÕÒÊÇ·ñ°üº¬Æ¥Åäxxxx/xx/xx.aspx¸ñʽµÄ×Ö·û´®£¬ÆäÖÐx±íʾÊý×Ö£¬Ã¿Ò»×éÊý×Ö±ØÐëÓÃÔ²À¨ºÅÀ¨ÆðÀ´£¬ÕâÑù¿ÉÒÔÔÚÏàÓ¦<SendTo>½ÚÄÚÒýÓÃÔ²À¨ºÅÄ򵀮¥Åä×Ö·û´®¡£ÎÒÃÇ¿ÉÒÔʹÓÃ$1¡¢$2¡¢$3À´·Ö±ðÒýÓÃÇ°ÃæÆ¥ÅäµÄÔ²À¨ºÅ×飬ÆäÖÐ$1£¬$2£¬$3·Ö±ð±íʾËùÆ¥ÅäµÄµÚÒ»¡¢µÚ¶þ¡¢µÚÈý¸öÔ²À¨ºÅ×é¡£
×¢Ò⣺ÓÉÓÚweb.configÊÇXML¸ñʽµÄÎĵµ£¬ËùÒÔÔÚÎı¾ÓòÄÚ±ØÐë»Ø±ÜÖ±½ÓʹÓÃÒ»Ð©ÌØÊâ×Ö·û£¬È磺&£¬<ºÍ>·ûºÅµÈ¡£ÔÚµÚÒ»ÌõÍøÖ·ÖØÐ´¹æÔòµÄ<SendTo>½ÚÖÐÓÃ&À´±íʾÒýÓÃ&·ûºÅ£¬ÔÚµÚ¶þÌõÍøÖ·ÖØÐ´¹æÔòµÄ<SendTo>½ÚÖÐÓÃ<![CDATA[...]]>ÔªËØÀ´±íʾÆäÖÐËùÓеÄÄÚÈݶ¼ÊÇÎı¾Óò£¬²»ÔÙÐèÒªÓÃתÒå×Ö·ûÀ´±íʾÒýÓá£ÕâÁ½ÖÖ·½·¨¶¼¿ÉÒÔʵÏÖͬÑùµÄÄ¿µÄ¡£
ÏÂÃæÍ¼Î塢ͼÁù¡¢Í¼Æß¶¼ÏÔʾ³öÍøÖ·ÖØÐ´µÄÔËÐÐ×´¿ö¡£ÕâЩÊý¾Ý¶¼ÕæÊµµØÕª×Ô×÷ÕßµÄBlog£¨http://ScottOnWritting.net£©£¬Í¼ÎåÏÔʾ2003Äê11ÔÂ7ÈÕµÄÌû×Ó£¬Í¼ÁùÏÔʾËùÓÐ2003Äê11ÔµÄÌû×Ó£¬Í¼ÆßÏÔʾ2003ÄêËùÓÐÌû×Ó¡£

ͼÎå.ÏÔʾ2003Äê11ÔÂ7ÈÕµÄÌû×Ó

ͼÁù. ÏÔʾ2003Äê11ÔÂËùÓеÄÌû×Ó


ͼÆß. ÏÔʾ2003ÄêËùÓеÄÌû×Ó

×¢Ò⣺ҪʹÓÃÍøÖ·ÖØÐ´ÒýÇæ£¬Ç¿ÁÒÍÆ¼öÔÚ<LookFor>½ÚÖÐʹÓÃÕýÔò±í´ïʽ¡£Èç¹ûÄã¶ÔÕýÔò±í´ïʽ²»ÊǺÜÊìϤ£¬¿ÉÒÔÏÈÔĶÁ×÷Õß±¾ÈËдµÄһƪÎÄÕÂAn Introduction to Regular Expressions£¬´ËÍ⻹¿ÉÒÔÔÚRegexLib.com Éϲéѯ³£ÓõÄÕýÔò±í´ïʽ£¬»ò°ÑÄã×Ô¼ºÉè¼ÆµÄÕýÔò±í´ïʽÌá½»µ½¸ÃÕ¾µã¹²ÏíʹÓá£

1.14. ´´½¨±ØÐëµÄĿ¼½á¹¹
µ±IIS½ÓÊÕµ½¶Ô/2004/03/19.aspxµÄÇëÇóʱ£¬Ëû·¢ÏÖÎļþÀ©Õ¹Ãû.aspx£¬±ã½«¸ÃÇëÇóת½»¸øASP.NETÒýÇæ´¦Àí£¬ÔÚASP.NET ÒýÇæÖд«µÝʱ£¬¸ÃµØÖ·±»ÖØÐ´µ½/ShowBlogContent.aspx?year=2004&month=3&day=19£¬×îºóÓû§½«¿´µ½¸ÃBlogÉÏ2004Äê3ÔÂ19ÈÕËùÓеÄÌû×Ó£¬µ«ÊÇÔÚÓû§·ÃÎÊ/2004/03/ʱ»á·¢ÉúÊ²Ã´ÄØ£¿³ý·ÇÒѾ­´æÔÚÒ»¸ö/2004/01/µÄĿ¼£¬·ñÔòIIS½«·µ»ØÒ»¸ö404´íÎ󣬶øÇÒ¸ÃĿ¼Ï»¹±ØÐëÒªÓÐÒ»¸öĬÈÏÒ³ÃæDefault.aspx£¬IIS²ÅÄܽ«ÇëÇóת½»¸øASP.NETÒýÇæ´¦Àí¡£
ͨ¹ýÕâÖÖ·½·¨ÄãµÃÊÖ¶¯ÎªÃ¿Ò»ÄêµÄBlog´´½¨Ò»¸öÄê·ÝµÄĿ¼²¢ÔÚ¸ÃÄê·ÝÏ·ÅÖÃÒ»¸öĬÈÏÎļþDefault.aspx£¬¶øÇÒ»¹µÃÔÚ¸ÃÄê·ÝĿ¼Ï´´½¨Ã¿Ò»ÔµÄĿ¼£¬´Ó01¡¢02¡¢...¡¢12£¬Ã¿Ò»¸öĿ¼ÏÂÒ²Òª·ÀÖ¹Ò»¸öĬÈÏÎļþDefault.aspx¡££¨»ØÏëÇ°ÃæµÄÀý×Ó£¬ÎªÁ˽«/Products/ÖØÐ´µ½/ListCategories.aspxÒ²ÊÇÒª½¨Á¢Ò»¸ö/Products/Ŀ¼²¢·ÅÖÃÒ»¸öĬÈÏDefault.aspxÎļþ¡£
ºÜÃ÷ÏÔ£¬ÕâÑù´´½¨Ä¿Â¼½á¹¹µÄ¹ý³ÌÊǺÜÍ´¿àµÄ¡£½â¾öÕâÖÖÎÊÌâµÄÒ»¸ö°ì·¨¾ÍÊÇÉèÖÃIIS½«ËùÓнÓÊÕµÄÇëÇó¶¼×ª½»¸øASP.NETÒýÇæÀ´´¦Àí£¬ÕâÖÖ·½·¨£¬ÉõÖÁÁ¬·ÃÎÊÕâÖÖµØÖ·/2004/04/£¬IIS¶¼ÈçʵµØ½«Æäת½»¸øASP.NETÒýÇæ´¦Àí£¬ÕâÖÖ·½·¨Ôì³ÉASP.NETÒýÇæµÃ´¦ÀíËùÓд«ÈëµÄÇëÇ󣬰üÀ¨cssÎļþ£¬Í¼Æ¬Îļþ¡¢JavascriptÎļþÒÔ¼°FlashÎļþµÈµÈ¡£
¹ØÓÚ¶ÔËùÓÐÀàÐÍÎļþµÄ´¦ÀíµÄÏêϸÌÖÂÛÒѾ­³¬³öÁ˱¾Ê鷶Χ¡£ÓйØÔÚASP.NET WebÓ¦ÓóÌÐòÖÐʹÓÃÕâЩ¼¼ÊõµÄÀý×ÓÇë·ÃÎÊ .Text Õâ¸ö¿ªÔ´µÄBlog¡£.Text ¿ÉÒÔͨ¹ýÅäÖý«ËùÓÐÇëÇó¶¼×ª½»¸øASP.NET´¦Àí¡£ËüʹÓÃÁËÒ»¸ö×Ô¶¨ÒåµÄHttpHandlerÀ´´¦ÀíËùÓÐÀàÐ͵ÄÎļþÀàÐÍ£¬Õâ¸ö×Ô¶¨ÒåµÄHttpHandler¿ÉÒÔʶ±ð²¢ÅжÏÈçºÎ´¦ÀíËùÓеÄÎļþÀàÐÍ¡££¨Í¼ÏñÎļþ¡¢CSSÎļþµÈµÈ¡££©

1.15. ½áÊøÓï
±¾ÎÄ̽ÌÖÁËͨ¹ýÀàHttpContextÀàµÄRewriteUrl()·½·¨À´ÊµÏÖASP.NETÒ»¼¶µÄÍøÖ·ÖØÐ´£¬ÕýÈçÎÒÃÇËù¿´µ½ÄÇÑù£¬RewriteUrl()·½·¨ÔÚÐÞ¸ÄÕâ¸öÌØÓеÄHttpContextµÄRequestµÄÊôÐÔʱҲÐÞ¸ÄÁËËùÇëÇóµÄÎļþºÍ·¾¶¡£Êµ¼ÊµÃµ½µÄЧ¹û¾ÍÊÇÔÚÓû§·ÃÎÊÆäÌØÓеÄÍøÖ·µÄʱºò£¬Ëûʵ¼ÊÈ´ÊÇÔÚ·þÎñÆ÷¶ËÇëÇóÁíÒ»¸öÓë´Ë²»Í¬µÄÍøÖ·¡£
ÍøÖ·ÖØÐ´²»µ«¿ÉÒÔÔÚHttpModuleÖÐÖ´ÐУ¬Ò²¿ÉÒÔÔÚHttpHandlerÖÐÔËÐС£±¾ÎÄÎÒÃÇ̽ÌÖÁËÔÚÒ»¸öHttpModuleÖÐÖ´ÐÐÍøÖ·ÖØÐ´£¬Ò²Ñо¿ÁËÒ»ÏÂÍøÖ·ÖØÐ´ÔÚASP.NETÖеĸ÷¸ö²»Í¬³¡ËùµÄÇé¿ö¡£
µ±È»£¬ÔÚASP.NETÒ»¼¶µÄÍøÖ·ÖØÐ´ÖУ¬Ö»ÓÐÔÚIIS³É¹¦µØ½«ÇëÇóת½»¸øASP.NETÒýÇæºó²ÅÄܳɹ¦µØÖ´ÐУ¬µ±Óû§ÇëÇóÒ»¸öÀ©Õ¹ÃûΪ.aspxµÄÎļþʱÕâºÜ×ÔÈ»µØ·¢Éú¡£È»¶ø£¬Èç¹ûÒªÈÃÓû§ÊäÈëÒ»¸öʵ¼Ê²¢²»´æÔÚµÄÍøÖ·£¬Í¨¹ýÍøÖ·ÖØÐ´µ½ÁíÒ»¸ö´æÔÚµÄaspxÒ³Ãæ£¬Äã±ØÐëΪ¸ÃÇëÇó´´½¨ÏàÓ¦µÄĿ¼ºÍĬÈϵÄDefault.aspxÒ³Ãæ£¬³ý·ÇÅäÖÃIISÈÃËü°ÑËùÓеÄÇëÇó¶¼×ª½»¸øIIS´¦Àí£¬µ«ÊÇÕâÖÖ·½Ê½Ã¤Ä¿µØ½«ËùÓÐÇëÇó¶¼×ª½»¸øÁËASP.NETÒýÇæ¡£
1.16. ²Î¿¼
±¾ÎÄÔ´´úÂëÏÂÔØµØÖ·£ºhttp://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi
¡¶ÉîÈëÑо¿IISÓëASP.NET¡·(Inside IIS and ASP.NET) ×÷ÕߣºMichele Leroux Bustamante
¹¤×÷²Î¿¼£ºÍøÖ·ÖØÐ´ÊÇÒ»¸öÆÄÊÜ»¶Ó­µÄÖ÷Ì⣬²»ÂÛÊÇASP.NET»¹ÊÇÆäËû¾ºÕù¶ÔÊÖ¶¼¶ÔÆä±íʾ³ö¾Þ´óµÄ¹Ø×¢¡£ÀýÈ磺Apache Web ServerÌṩÁËÒ»¸ö½Ð×ömod_rewritingµÄÄ£¿é£¬mod_rewritingÊǸö¹¦ÄÜÍêÉÆµÄÍøÖ·ÖØÐ´ÒýÇæ£¬ËüÌṩ»ùÓÚHTTP Í·ÐÅÏ¢ºÍ·þÎñÆ÷²ÎÊý»·¾³µÄÍøÖ·ÖØÐ´¹¦ÄÜ£¬ÉõÖÁ»¹ÌṩÓÃÕýÔò±í´ïʽÀ´´´½¨ÍøÖ·ÖØÐ´¹æÔò¡£ÓйØmod_rewriting¸ü¶àÐÅÏ¢Çë²Î¿¼A User's Guide to URL Rewriting with the Apache Web Server¡¶Apache Web ServerÍøÖ·ÖØÐ´Óû§Ïòµ¼¡·¡£
ÕâÀïÓÐÏ൱ÊýÁ¿µÄ¹ØÓÚASP.NET¼¶±ðÏÂÍøÖ·ÖØÐ´µÄÎÄÕ£º
Rewrite.NET - A URL Rewriting Engine for .NET̽ÌÖÄ£Äâmod_rewritingµÄÕýÔò±í´ïʽÃèÊöµÄÍøÖ·ÖØÐ´¹æÔòÀ´ÊµÏÖASP.NETÏÂÍøÖ·ÖØÐ´£»
URL Rewriting With ASP.NETÌṩ¶ÔASP.NETÏÂÍøÖ·ÖØÐ´ÄÜÁ¦µÄ×ܵĸÅÊö£»
Ian GriffithsÓÐÒ»¸öBlog£¬ÉÏÃæÓÐÐí¶àÓйØÔÚASP.NETÖÐʵÏÖÍøÖ·ÖØÐ´µÄ½¨Ò飬±ÈÈç±¾ÎÄËùÌáµ½µÄ¿¼Âǵ½Êý¾Ý»ØËÍʱµÄ×ö·¨£»
Fabrice MarguerieºÍJason Salas¶¼¸÷ÓÐÒ»¸öBlog£¬ÔÚÉÏÃæ¿ÉÒÔÕÒµ½Óйؽ«ASP.NETÍøÖ·ÖØÐ´À´Íƶ¯ËÑË÷ÒýÇæµÄ²éÕÒÌæ»»µÄÎÄÕ¡£
£¨Fabrice Marguerie: http://weblogs.asp.net/fmarguerie/archive/2003/12/24/45712.aspx£©
£¨Jason Salas: http://weblogs.asp.net/jasonsalas/archive/2003/12/14/43404.aspx£©

">>
~/ListProductsByCategoryID.aspx?CategoryID=1</SendTo>
        
</RewriterRule>
    
</Rules>
</RewriterConfig>

ºÜÃ÷ÏԵؿ´µ½£¬ËÑË÷Óû§·ÃÎʵÄ·¾¶ÊÇ·ñÆ¥Åä/Products/Baverage.aspx£¬Èç¹ûÆ¥ÅäµÄ»°£¬Ôò½«ÍøÖ·ÖØÐ´µ½/ListProductsByCategoryID.aspx?CategoryID=1¡£
×¢Ò⣺Äã»á·¢ÏÖ<LookFor>½ÚµãÖбÜÃâÖ±½ÓÔÚ¡°Baverage.aspx¡±ÖÐʹÓþäµã¡°.¡±ÊÇÒòΪ<LookFor>½ÚµãµÄÖµÊÇÕýÔò±í´ïʽµÄÆ¥Åäģʽ£¬ÔÚÕýÔò±í´ïʽÖоäµã·ûºÅÊÇÒ»¸öÌØÊâ×Ö·û£¬Ëü±íʾƥÅäÈκÎÒ»¸ö×Ö·û£¬Ò²¾ÍÊÇ˵Èç¹û·ÃÎÊBaverageQaspxʱҲ»á·¢ÉúÆ¥Å䣬ΪÁ˱ÜÃâ·¢ÉúÕâ¸ö¾äµãÒýÆðµÄÆ¥ÅäÎÒÃǵÃÔڸþäµã·ûºÅÇ°Ãæ¼ÓÉÏÒ»¸ö¡°\¡±£¬±íʾÒýÓþäµã·ûºÅ
ͨ¹ý¸Ã¹æÔò¶¨Ò壬µ±Óû§·ÃÎÊ/Products/Baverage.aspxÎļþµÄʱºò£¬ËûÃǽ«¿´µ½´úÊÛµÄÒûÁÏÀàÉÌÆ·ÁбíÐÅÏ¢¡£Í¼3Ϊ·ÃÎÊ/Products/Baverage.aspxµØÖ·Ê±µÄä¯ÀÀÆ÷½ØÍ¼£¬×¢ÒâÔÚä¯ÀÀÆ÷ÖеØÖ·À¸ÉÏÏÔʾµÄÊÇÓû§ÊäÈëµÄ/Products/Baverage.aspxµØÖ·£¬µ«ÊÇʵ¼Ê·ÃÎʵĵØÖ·È´ÊÇÍøÖ·ÖØÐ´ºóµÄ/ListProductsByCategoryID.aspx?CategoryID=1¡££¨ÊÂʵÉÏ£¬ÔÚ·þÎñÆ÷Éϸù±¾¾Í²»´æÔÚ/Products/Baverage.aspxÎļþ£¡£©

ͼÈý£®ÍøÖ·ÖØÐ´ºóµÄ¶ÔÉÌÆ··ÖÀàµÄÇëÇó

ºÍ/Products/Baverage.aspxÀàËÆ£¬ÏÂÒ»²½ÎÒÃÇÌí¼ÓÆäËü·ÖÀàµÄÖØÐ´¹æÔò£¬Ö»Ðè¼òµ¥µØÔÚweb.configÎļþÖÐ<Rules>ÖÐÔÚÌí¼ÓÆäËû<RewriteRule>½Ú¼´¿É¡£¸ÃÑÝʾÍêÕûµÄÖØÐ´¹æÔò¼¯ºÏÇë²Î¿¼ÏÂÔØÎĵµµÄweb.configÎļþÖе͍Òå¡£
ΪÁËÈøÃÍøÖ·¸ü¾ßÓС°Òþ±ÎÐÔ¡±£¬Èç¹ûÈÃÓû§°Ñ/Products/Baverage.aspxºóÃæBaverage.aspxÒ»¶Î½ØÈ¥£¬ÔÚä¯ÀÀÆ÷ÖÐÊäÈë/Products/À´ä¯ÀÀ²úÆ··ÖÀàÁбí»á¸üºÃһЩ¡£Õ§Ò»¿´£¬ÕâÏîÈÎÎñ΢²»×ãµÀ£¬Ö»ÐèÌí¼ÓÒ»ÌõÍøÖ·ÖØÐ´¹æÔò½«/Products/Ó³Éäµ½/ListCategories.aspx¼´¿É¡£È»¶øÕâÀïÓÐÒ»¸ö΢ÃîÖ®´¦£¬Äã±ØÐëÏÈ´´½¨Ò»¸ö/Products/Ŀ¼£¬²¢ÔÚÀïÃæ·ÅÒ»¸ö¿ÕÎļþDefault.aspx¡£
ÒªÈÏʶΪʲôÕâЩ¶îÍâµÄ²½ÖèÊDZØÐëµÄ£¬ÏȻعËÒ»ÏÂǰÎÄ¡£ÍøÖ·ÖØÐ´ÒýÇæÊÇ´¦ÓÚASP.NETÒ»¼¶µÄ£¬Ò²¾ÍÊÇ˵£¬Èç¹ûASP.NETûÓлñµÃ´¦ÀíÇëÇóµÄ»ú»áµÄ»°£¬ÍøÖ·ÖØÐ´ÒýÇæ¾Í²»ÄܶÔÊäÈëµÄÍøÖ·ÇëÇó×÷³öÅжϡ£´ËÍ⣬IIS½öÔÚÇëÇóÎļþ°üº¬ÏàÓ¦À©Õ¹Ãûʱ²Å½«ÇëÇóת½»¸øASP.NETÒýÇæ¡£Èç¹ûÓû§·ÃÎÊ/Products/£¬IIS²¢²»ÖªµÀÆäÀ©Õ¹ÃûÊÇʲô£¬ÓÚÊÇËü¼ì²é¸ÃĿ¼ÏµÄÎļþ¿´ÊÇ·ñ°üº¬ÓÐĬÈÏÊ×Ò³ÎļþÃû£¨Default.aspx,Default.htm,Default.asp,µÈµÈ£¬ÕâЩÎļþÃûÔÚIIS¹ÜÀí¹¤¾ß¶Ô»°¿òÖÐWeb·þÎñÆ÷ÊôÐÔ¶Ô»°¿òÖеÄÎĵµ±êÇ©Öж¨Òå¡££©µ±È»£¬Èç¹û/Products/Ŀ¼²»´æÔڵϰ£¬IIS½«·µ»ØÒ»¸öHTTP 404´íÎó¡£
ËùÒÔÎÒÃÇÐèÒª´´½¨Ò»¸ö/Products/Ŀ¼²¢ÔÚ¸ÃĿ¼Ï¶îÍâ´´½¨Ò»¸ö¿ÕÎļþDefault.aspx£¬IIS»á¼ì²é¸ÃĿ¼ÏµÄÎļþ£¬·¢ÏÖÓÐÒ»¸öĬÈÏÎļþÃûDefault.aspx£¬ÓÚÊǽ«ÇëÇóת½»¸øASP.NET£¬ÕâÑù£¬ÍøÖ·ÖØÐ´ÒýÇæ²ÅÄÜÉúЧ¡£

<RewriterRule>
    
<LookFor>~/Products/Default.aspx</LookFor>
    
<SendTo>~ListCategories.aspx</SendTo>
</RewriterRule>

ͨ¹ý¸Ã¹æÔò£¬Óû§·ÃÎÊ/Products/Default.aspx»òÕß·ÃÎÊ/Products/¶¼¿ÉÒÔ¿´µ½ÈçͼËÄËùʾµÄ²úÆ··ÖÀàÁÐ±í¡£

ͼËÄ.ÔÚÍøÖ·ÉÏÌí¼Ó¡°Òþ±ÎÐÔ¡±

1.12.4.´¦Àí»ØËÍÊý¾Ý
Èç¹ûÒªÖØÐ´µÄÍøÖ·Éϰüº¬ÓзþÎñÆ÷¶ËWeb Form²¢Ö´ÐÐÊý¾Ý»ØËÍ£¬µ±¸ÃWeb Form»ØËÍÊý¾Ýʱ»á±©Â¶³öÕæÊµµÄÍøÖ·£¬Ò²¾ÍÊÇ˵£¬µ±Óû§·ÃÎÊ/Products/Baverage.aspxʱ£¬ä¯ÀÀÆ÷ÉϵØÖ·À¸ÏÔʾµÄÒ²ÊÇ/Products/Baverage.aspx£¬µ«ÊÇʵ¼ÊÉÏÊÇ·ÃÎÊ/ListProdutsByCategoryID.aspx?CategoryID=1µÄÄÚÈÝ£¬Èç¹ûListProductsByCategoryID.aspxÒ³ÃæÖ´ÐÐÁËÊý¾Ý»ØË͵ϰ£¬Óû§±»Êý¾Ý»ØËͶ¨Ïò¸øÔ­Ê¼µÄ/ListProductByCategoryID.aspx?CategoryID=1Ò³ÃæÉÏ£¬¶ø²»ÊÇ/Products/Baverage.aspxÒ³Ãæ¡£ÕâËäÈ»²»ÊÇʲô´óÎÊÌ⣬µ«ÊÇÓû§»á¾õ²ìµ½µã»÷Ò»¸ö°´Å¥Ê±ÍøÖ··¢ÉúÁ˵ı仯£¬ÕâÒ²Ðí»áÁîÈ˲»°²£¬ÒòΪÈç¹û³öÓÚÍøÖ·°²È«µÄ½Ç¶ÈÀ´Ëµ£¬Ö±½Ó°ÑÕæÊµµÄÍøÖ·±©Â¶³öÀ´ÁË¡£
Ö®ËùÒÔ·¢ÉúÕâÖÖÏÖÏóµÄÔ­ÒòÊǵ±Web FormÔÚ³ÊÏÖ֮ʱ¾ÍÃ÷È·µØÉèÖÃÆäactionÊôÐÔΪµ±Ç°Request¶ÔÏóÖÐÎļþ·¾¶µÄÖµ¡£µ±È»£¬ÔÚWeb Form³ÊÏÖ֮ʱ£¬´Ó/Produts/Baverage.aspxµ½/ListProductsByCategoryID.aspx?CategoryID=1µÄÍøÖ·ÖØÐ´¾ÍÒѾ­Ö´ÐÐÍê±ÏÁË£¬ÕâÒâζ×ÅRequest¶ÔÏóËù»ã±¨µÄÊǵ±Ç°Óû§Ëù·ÃÎʵĵØÖ·ÊÇ/ListProductsByCategoryID.aspx?CategoryID=1¡£Õâô¿´À´£¬Ö»ÐèÈø÷þÎñÆ÷¶Ë±íµ¥ÔÚ³ÊÏÖ֮ʱ²»³ÊÏÖactionÊôÐÔ¼´¿É½â¾öÎÊÌâÁË¡££¨¶Ôä¯ÀÀÆ÷À´Ëµ£¬Èç¹û²»ÉèÖÃactionÊôÐԵϰ£¬ÄÇôÔÚÌá½»µÄʱºò½«Ê¹ÓÃÆäĬÈÏÖµ¡££©
È»¶ø²»ÐÒµÄÊǸÃWeb Form²»»áÔÊÐíÄãÖ¸¶¨actionÊôÐÔ£¬Ò²²»»áÔÊÐíÄãͨ¹ýÉèÖÃһЩÊôÐÔÀ´´ïµ½½ûÓóÊÏÖactionÊôÐÔµÄÄ¿µÄ¡£µÃ×ÔÐм̳ÐSystem.Web.HtmlControls.HtmlFormÕâ¸öÀ࣬²¢ÖØÔظÃÀàµÄRenderAttribute()·½·¨£¬Ã÷È·Ö¸³ö¸ÃÀ಻³ÊÏÖactonÊôÐÔ¡£
¸Ðл¼Ì³ÐÕâ¸öÇ¿´óµÄ¹¦ÄÜ£¬Ê¹µÃÎÒÃǺܼòµ¥¾Í»ñÈ¡ÁËHtmlFormÕâ¸öÀàÏÂËùÓеŦÄܶ¨Ò壬ֻÐèÉÙÁ¿¼¸ÐдúÂë¾Í´ïµ½ËùÐèÄ¿µÄ£¬ÍêÕû´úÂëÈçÏÂËùʾ£º

namespace ActionlessForm
{
        
public class Form:System.Web.UI.HtmlControls.HtmlForm
        
{
                
protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)
                
{
                        writer.WriteAttribute(
"name",this.Name);
                        
base.Attributes.Remove("name");

                        writer.WriteAttribute(
"method",this.Method);
                        
base.Attributes.Remove("method");

                        
this.Attributes.Render(writer);

                        
base.Attributes.Remove("action");

                        
if (base.ID!=null)
                        
{
                                writer.WriteAttribute(
"id",this.ClientID);
                        }

                }

        }

}

¶ÔRenderAttributes()·½·¨ÖØÔصĴúÂë°üº¬ÁËÔ­ÀàHtmlFormµÄRenderAttributes()·½·¨È«²¿µÄ´úÂëÄÚÈÝ£¬Ö»ÊǼòµ¥µØÈ¥µôÁËÉèÖÃactionÊôÐÔÕâÒ»½Ú¡££¨ÎҲο¼ÁËLutz RoederµÄReflecterÒ»ÎÄÖÐÀàHtmlFormµÄÔ´´úÂ룩
µ±´´½¨²¢±àÒëÁËÕâ¸öÀàºó£¬½«ÆäÌí¼Óµ½ÒýÓÃĿ¼¼´¿ÉÔÚ¸ÃASP.NET WebÓ¦ÓóÌÐòÖÐʹÓá£ÎªÁ˽«Ô­ÓÐHtmlFormÀàÌæ»»£¬Ö»Ðè¼òµ¥µØÔÚÒ³Ãæ¶¥²¿Ìí¼ÓÏÂÁдúÂ룺

<%@ Register TagPrefix="skm" Namespace="ActionlessForm" Assembly="ActionlessForm"%>

È»ºó½«<Form runat=¡±server¡±>±êÇ©Ìæ»»Îª

<skm:Form id="Form1" method="post" runat="Server">

²¢½«½áÊø±ê¼Ç</Form>Ìæ»»Îª

<skm:Form>

Äã¿ÉÒԲ鿴¸ÃÎĵµÏà¹ØÏÂÔØÖеÄListProductsByCategoryID.aspxÎļþÖеÄ×Ô¶¨ÒåWeb Form£¬¸ÃÏÂÔØÒѾ­ÌṩÁËÍêÕûµÄVisual Studio.NETÏîÄ¿Îļþ°ü¡£
×¢Ò⣺Èç¹ûÄã´òËã½øÐÐÍøÖ·ÖØÐ´µÄµØÖ·²»Ö´ÐÐÊý¾Ý»ØËÍ£¬ÔòûÓбØÒªÊ¹ÓøÃ×Ô¶¨ÒåWeb FormµÄÀà¡£

1.13. ´´½¨ÕæÕý¡°Òþ±Î¡±µÄÍøÖ·
ÉÏÒ»½Ú¼òµ¥ÍøÖ·ÖØÐ´µÄʾÀýչʾÁËÈçºÎͨ¹ýеÄÍøÖ·ÖØÐ´¹æÔòÀ´ÇáËɵØÅäÖÃÍøÖ·ÖØÐ´ÒýÇæ£¬±¾½Ú½«Í¨¹ý³öÖÚµÄÕýÔò±í´ïʽÀ´Õ¹Ê¾ÍøÖ·ÖØÐ´µÄÇ¿´óÍþÁ¦¡£
ʱÏÂÕýÔÚÁ÷ÐÐBlog£¬ºÜ¶àÈ˶¼ÓµÓÐÒ»¸ö×Ô¼ºµÄBlog¡£²»ÂÛÄãÊÇ·ñ¶ÔBlog¸Ðµ½Ä°Éú£¬ËûÃÇÕýÔÚ²»¶ÏµØ¸üÐÂ×Ô¼ºµÄBlogÒ³Ãæ£¬ÕâÐ©Ò³Ãæ¾ÍÏñÒ»¸ö¸öÈËÈռDZ¾Ò»Ñù¡£´ó¶àÊýBlogerÖ»ÊǼòµ¥µØ¼Ç¼ÿÌì·¢ÉúµÄÊÂÇ飬ҲÓÐһЩ¾Û½¹ÓÚijһÖ÷Ì⣬±ÈÈçÓ°ÆÀ¡¢ÇòÃÔ×éÖ¯¡¢µçÄÔ¼¼ÊõµÈ¡£
Blog¿ÉÒÔÔÚÈκεصãÓÉ×÷Õß½øÐиüУ¬¸üдÎÊý¿ÉÒÔÊÇÒ»Ìì¶à´Î£¬Ò²¿ÉÒÔÊÇÒ»ÖÜÒ»Á½´Î¡£ÔÚBlogÒ³ÃæÉÏÖ»ÏÔʾ×î½ü10Ìõ¸üУ¬µ«ÊÂʵÉÏËùÓеÄBlogÈí¼þ¶¼ÌṩÁË´æµµ¼Ç¼£¬·Ã¿Í¿ÉÒÔÔĶÁÆäÀúÊ·¼Ç¼¡£ÓÐÁË¡°Òþ±Î¡±µÄÍøÖ·£¬BlogÓ¦ÓóÌÐò½«±äµÃ¸ü¼ÓÇ¿´ó¡£¼Ù¶¨Äãͨ¹ý/2004/02/14.aspxÀ´²éѯ×Ô¼ºµÄBlogÉϵÄÎÄÕ£¬Äã»áΪÔĶÁµ½2004Äê2ÔÂ14ÈÕµÄBlog¸Ðµ½¾ªÑÈÂ𣿴ËÍâÄã¿ÉÄÜΪÁË·ÃÎÊ2004Äê2ÔÂËùÓеÄBlog¶ø½«¸ÃµØÖ·²Ã¼õΪ/2004/02/£¬Òª·ÃÎÊ2004ÄêËùÓеÄBlog£¬Äã¿ÉÄÜ»áÊÔ×ÅÈ¥·ÃÎÊ/2004/¡£
ÔÚά»¤Ò»¸öBlogµÄʱºò£¬Èç¹û½«ÕâÖÖ¾ßÓС°Òþ±ÎÐÔ¡±µÄÍøÖ·Ìṩ¸øÓû§½«»á¸üºÃ¡£Êµ¼ÊÉϺܶàBlogÒýÇæ¶¼ÌṩÁËÕâÖÖÍøÖ·ÖØÐ´µÄ¹¦ÄÜ£¬ÏÖÔÚÀ´¿´¿´ÕâЩÊÇÈçºÎͨ¹ýÍøÖ·ÖØÐ´ÊµÏֵġ£
Ê×ÏÈ£¬ÎÒÃÇÐèÒªÒ»¸öÒ³ÃæÄܹ»·Ö±ð°´ÕÕÄê¡¢Ô¡¢ÈÕ·Ö±ðÏÔʾBlogµÄÄÚÈÝ¡£¼Ù¶¨ÏÖÔÚÒѾ­×öºÃÁËÒ»¸öÒ³ÃæÎļþShowBlogContent.aspx£¬ËüÄÜ·Ö±ð»ñÈ¡Äê¡¢Ô¡¢ÈյIJéѯ²ÎÊý£¬Òª²é¿´2004Äê2ÔÂ14ÈÕËù·¢µÄÌû×Ó£¬ÎÒÃÇ¿ÉÒÔ·ÃÎÊ/ShowBlogContent.aspx?year=2004&month=2&day=14£¬Òªä¯ÀÀ2004Äê2ÔµÄÊý¾Ý¿ÉÒÔ·ÃÎÊ/ShowBlogContent.aspx?year=2004&month=2£¬Òª²éѯ2004ÄêËùÓÐÊý¾