zoukankan      html  css  js  c++  java
  • WebForms使用System.Web.Routing

    老赵同学写过 在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:      }

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

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    SQL随机生成6位数字
    安装时提示 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 解决办法
    Windows 7 完美安装 Visual C++ 6.0
    解决js中window.location.href不工作的问题
    DataList中动态显示DIV
    Gridview、DataList、Repeater获取行索引号
    Java多jdk安装
    【CentOS】samba服务器安装与配置
    【CentOS】IBM X3650M4 IMM远程管理【转载】
    【Java】Eclipse导出jar包与javadoc
  • 原文地址:https://www.cnblogs.com/shanyou/p/1367502.html
Copyright © 2011-2022 走看看