WebForms使用System.Web.Routing

12/23/2009来源:ASP技巧人气:4300

老赵同学写过 在Web应用程序开发过程中利用asp.net MVC框架的实战技巧 ,Routing现在可以作为URLRewriting技术的替代者,出现在asp.net mvc框架中,将它应用于WebForms上也是很简单的,可以到codeplex上下载ASP.NET MVC WebFormRouting Demo 。

实现的原理也是很简单的:

1、创建一个自定义的实例化你的页面的 IRouteHandler   

     1: public class WebFormRouteHandler : IRouteHandler {

   2:  
        public
WebFormRouteHandler(string
virtualPath)   3:  
            : this
(virtualPath, true
) {   4:  
        }   5:  
    6:  
        public
WebFormRouteHandler(string
virtualPath, bool
checkPhysicalUrlaccess) {   7:  
            if
(virtualPath == null
) {   8:  
                throw
new
ArgumentNullException("virtualPath"
);   9:  
            }  10:  
   11:  
            if
(!virtualPath.StartsWith("~/"
)) {  12:  
                throw
new
ArgumentException("virtualPath must start with a tilde slash: \"~/\""
, "virtualPath"
);  13:  
            }  14:  
   15:  
            this
.VirtualPath = virtualPath;  16:  
            this
.CheckPhysicalUrlAccess = checkPhysicalUrlAccess;  17:  
        }  18:  
   19:  
        /// <summary>
  20:  
        /// This is the full virtual path (using tilde syntax) to the WebForm page.
  21:  
        /// </summary>
  22:  
        /// <remarks>
  23:  
        /// Needs to be thread safe so this is only settable via ctor.
  24:  
        /// </remarks>
  25:  
        public
string
VirtualPath { get; PRivate
set; }  26:  
   27:  
        /// <summary>
  28:  
        /// Because we're not actually rewriting the URL, ASP.NET's URL Auth will apply
  29:  
        /// to the incoming request URL and not the URL of the physical WebForm page.
  30:  
        /// Setting this to true (default) will apply URL access rules against the
  31:  
        /// physical file.
  32:  
        /// </summary>
  33:  
        /// <value>True by default</value>
  34:  
        public
bool
CheckPhysicalUrlAccess { get; set; }  35:  
   36:  
        public
IHttpHandler GetHttpHandler(RequestContext requestContext) {  37:  
            string
virtualPath = GetSubstitutedVirtualPath(requestContext);  38:  
            if
(this
.CheckPhysicalUrlAccess && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(virtualPath, requestContext.HttpContext.User, requestContext.HttpContext.Request.HttpMethod))  39:  
                throw
new
SecurityException();  40:  
   41:  
            var page = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof
(Page)) as
IHttpHandler;  42:  
            if
(page != null
) {  43:  
                //Pages that don't implement IRoutablePage won't have the RequestContext
  44:  
                //available to them. Can't generate outgoing routing URLs without that context.
  45:  
                var routablePage = page as
IRoutablePage;  46:  
                if
(routablePage != null
)  47:  
                    routablePage.RequestContext = requestContext;  48:  
            }  49:  
            return
page;  50:  
        }  51:  
   52:  
        /// <summary>
  53:  
        /// Gets the virtual path to the resource after applying substitutions based on route data.
  54:  
        /// </summary>
  55:  
        /// <param name="requestContext"></param>
  56:  
        /// <returns></returns>
  57:  
        public
string
GetSubstitutedVirtualPath(RequestContext requestContext) {  58:  
            if
(!VirtualPath.Contains("{"
))  59:  
                return
VirtualPath;  60:  
   61:  
            //Trim off ~/
  62:  
            string
virtualPath = VirtualPath.Substring(2);  63:  
   64:  
            Route route = new
Route(virtualPath, this
);  65:  
            VirtualPathData vpd = route.GetVirtualPath(requestContext, requestContext.RouteData.Values);  66:  
            if
(vpd == null
)  67:  
                return
VirtualPath;  68:  
            return
"~/"
+ vpd.VirtualPath;  69:  
        }  70:  
    }2、使用自定义的 IRouteHandler注册一个新的Routes

   1:  
public
class
Global : System.Web.Httpapplication   2:  
    {   3:  
    4:  
        protected
void
Application_Start(object
sender, EventArgs e)   5:  
        {   6:  
            RegisterRoutes(RouteTable.Routes);   7:  
        }   8:  
    9:  
        public
static
void
RegisterRoutes(RouteCollection routes)  10:  
        {  11:  
            //We are intentionally creating this backdoor as a demonstration of
  12:  
            //bad security practices.
  13:  
            routes.MapWebFormRoute("Secret"
, "BackDoor"
, "~/Admin/SecretPage.aspx"
, false
);  14:  
            routes.MapWebFormRoute("Blocked"
, "FrontDoor"
, "~/Admin/SecretPage.aspx"
, true
);  15:  
   16:  
            //Even though we are not checking physical url access in this route, it should still block because the incoming
  17:  
            //request url would start with /Admin.
  18:  
            routes.MapWebFormRoute("Admin"
, "Admin/{*anything}"
, "~/Admin/SecretPage.aspx"
, false
);  19:  
   20:  
            routes.MapWebFormRoute("Named"
, "foo/bar"
, "~/forms/blech.aspx"
);  21:  
            routes.MapWebFormRoute("Numbers"
, "one/two/three"
, "~/forms/haha.aspx"
);  22:  
              23:  
            //Maps any requests for /haha/*.aspx to /forms/hahah.aspx
  24:  
            routes.MapWebFormRoute("Substitution"
, "haha/{filename}"
, "~/forms/haha.aspx"
);  25:  
        }  26:  
    }相关文章:

<span id="ctl00_ArticleTopHeader_ArticleTitle" class="ArticleTopTitle">Fight 404 errors with ASP.NET Routing :<a href="http://www.codeproject.com/KB/aspnet/routing404.aspx">http://www.codeproject.com/KB/aspnet/routing404.aspx</a></span>

msdn杂志文章:
使用 ASP.NET Web 窗体路由:http://msdn.microsoft.com/zh-cn/magazine/2009.01.extremeaspnet.aspx


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dz45693/archive/2009/12/22/5058018.aspx