C#中实现伪静态页面两种方式介绍

第一种是在页面global.asax中,相关代码如下

  

复制代码 代码如下:

  void Application_BeginRequest(object sender, EventArgs e)

  {

  HttpContext context = ((HttpApplication)sender).Context;

  string oldurl = context.Request.Path.ToLower();

  if ( ( oldurl.IndexOf("-") > 0 && oldurl.IndexOf(".") == -1) || (oldurl.IndexOf("-") > 0 && oldurl.IndexOf("aspx") > 0) )

  {

  string[] url = oldurl.Substring(oldurl.LastIndexOf("/") + 1).Replace(".aspx", "").Split('-');

  string path = oldurl.Substring(0, oldurl.LastIndexOf("/") + 1);

  //file

  string file = url[0];

  file = file.Replace("about", "detail");

  file = file.Replace("news", "list");

  file = file.Replace("down", "detail");

  file = file.Replace("case", "album");

  file = file.Replace("contact", "detail");

  //query

  string query = "";

  for ( int i=1;i<url.Length;i++ )

  {

  if (url[i] != "")

  {

  switch (i)

  {

  case 1:

  query += "id=" + url[i];

  break;

  case 2:

  query += "&page=" + url[i];

  break;

  case 3:

  query += "&key=" + url[i];

  break;

  case 4:

  query += "&v1=" + url[i];

  break;

  case 5:

  query += "&v2=" + url[i];

  break;

  case 6:

  query += "&v3=" + url[i];

  break;

  case 7:

  query += "&v4=" + url[i];

  break;

  case 8:

  query += "&v5=" + url[i];

  break;

  case 9:

  query += "&v6=" + url[i];

  break;

  case 10:

  query += "&v7=" + url[i];

  break;

  }

  }

  }

  //newurl

  string newurl = path + file + ".aspx?" + query;

  if( context.Request.ServerVariables["QUERY_STRING"] != null && context.Request.ServerVariables["QUERY_STRING"] != "" )

  newurl += "&" + context.Request.ServerVariables["QUERY_STRING"];

  //Response.Write(newurl);

  context.RewritePath(newurl);

  }

  第二种方法是在HttpModule.cs中,代码如下

  

复制代码 代码如下:

  public class HttpModule : IHttpModule

  {

  private const RegexOptions regexOptions = RegexOptions.IgnoreCase | RegexOptions.Compiled;

  private static readonly Regex regexFileName = new Regex(@".*?/([^./]*)\.aspx(.*)", regexOptions);

  private static readonly Regex regexRewritePath = new Regex(@"^.*?/(\w*)(-?(\w+)-([\w,\|,%]+))+\.aspx", regexOptions);

  public void Dispose()

  {

  }

  public void Init(HttpApplication httpApplication)

  {

  httpApplication.BeginRequest += ReUrl_BeginRequest;

  }

  private static void ReUrl_BeginRequest(object sender, EventArgs e)

  {

  Globals.Catch(

  () =>

  {

  var context = ((HttpApplication)sender).Context;

  var request = context.Request;

  var url = request.Url;

  if (!VerifyUrl(url))

  {

  string input = url.PathAndQuery.ToLower();

  //Loger.Debug("PathAndQuery-->" + input);

  //Loger.Debug("AbsolutePath-->" + url.AbsolutePath);

  //Loger.Debug("AbsoluteUri-->" + url.AbsoluteUri);

  //Loger.Debug("DnsSafeHost-->" + url.DnsSafeHost);

  //Loger.Debug("LocalPath-->" + url.LocalPath);

  //Loger.Debug("AppDomain.CurrentDomain.BaseDirectory-->" + AppDomain.CurrentDomain.BaseDirectory);

  //Loger.Debug("Globals.GlobalsVirtualFilePath-->" + Globals.GlobalsVirtualFilePath);

  if (input.StartsWith(Globals.GlobalsVirtualFilePath))

  input = input.Remove(0, Globals.GlobalsVirtualFilePath.Length);

  string viewmode = Globals.ViewMode;

  var themeName = request.QueryString["theme"] ?? "";

  if (string.IsNullOrEmpty(themeName))

  {

  themeName = Globals.ThemeName;

  }

  if (input == "/")

  input = "/index.aspx";

  if (viewmode == "Rewrite")

  {

  Loger.Debug("now input-->" + input);

  Match match = regexRewritePath.Match(input);

  if (match.Success && match.Groups.Count == 5)

  {

  var captures3 = match.Groups[3].Captures;

  var captures4 = match.Groups[4].Captures;

  var itemCount = match.Groups[3].Captures.Count;

  var list = new List<string>();

  for (var i = 0; i < itemCount; i++)

  {

  list.Add(string.Concat(captures3[i].Value, "=", captures4[i].Value));

  }

  context.RewritePath(Globals.AspxFileUrl(themeName, match.Groups[1].Value + ".aspx?" + string.Join("&", list.ToArray())));

  return;

  }

  }

  var fileName = regexFileName.Match(request.Path.ToLower()).Groups[1].ToString();

  if (string.IsNullOrEmpty(fileName))

  return;

  new ConvertTheme(context)

  {

  ThemeName = themeName,

  ViewMode = viewmode

  }.Display(fileName);

  }

  });

  }

  private static bool VerifyUrl(Uri uri)

  {

  var url = uri.AbsolutePath.ToLower();

  if (url.StartsWith(Globals.GlobalsVirtualFilePath))

  url = url.Remove(0, Globals.GlobalsVirtualFilePath.Length);

  return uri.IsFile

  || url.IndexOf("site") != -1

  || url.IndexOf("sys") != -1

  || url.IndexOf("html") != -1

  || url.IndexOf("user") != -1

  || url.IndexOf("bbs") != -1

  || url.IndexOf("_module.aspx") != -1

  || url.IndexOf("webresource.axd") != -1

  || url.IndexOf("scriptresource.axd") != -1;

  }

  }