URL重寫及干掉ASP.NET試圖狀態的實現方法
2024-07-10 12:41:39
供稿:網友
1、URL重寫已經很普遍了,但基本上大部分的URL重寫都不支持頁面的相對路徑,所有如果想在已經開發好的項目中添加還是有壓力的,第二就是例如微軟的那個URL重寫是根據正則表達式來處理的,那樣是很好,但也有不足之處,就是不方便定位到某個頁面只能有哪些參數。
我覺得要解決的問題有一下幾個:
1、解決如圖片js等不能使用相對路徑的文件
2、解決某個頁面能有幾個參數和哪些參數是可選的
下面就是解決掉這些問題了
添加處理程序MyHttpModule,下面是我的一個簡單的處理程序(我只是做了一個簡單的,并沒有考慮性能,而且我是寫死的一個url重寫就是重寫成沒有擴展名的)
代碼如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Text;
namespace MyClass
{
public class MyHttpModule : IHttpModule
{
#region IHttpModule 成員
///<summary>
/// 釋放所有資源
///</summary>
public void Dispose()
{
}
///<summary>
/// 初始化模塊,并使其為處理請求做好準備
///</summary>
///<param name="context"> 一個 System.Web.HttpApplication,它提供對 ASP.NET 應用程序內所有應用程序對象的公用的方法、屬性和事件的訪問</param>
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new
EventHandler(this.BaseModuleRewriter_AuthorizeRequest);
}
///<summary>
/// 當安全模塊已驗證用戶授權時發生
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected virtual void BaseModuleRewriter_AuthorizeRequest(
object sender, EventArgs e)
{
System.Web.HttpApplication app = (System.Web.HttpApplication)sender;
Rewrite(app.Request.Path, app);
}
///<summary>
/// 重寫url
///</summary>
///<param name="requestedPath">url的虛擬路徑</param>
///<param name="app"></param>
protected void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
List<string> qeryString;
string virtualPath;
string inputFile = GetInputFile(app.Context, out virtualPath, out qeryString);//獲取到真實的文件信息
if (System.IO.Path.GetExtension(inputFile) == ".aspx")//如果是aspx文件 那么則把保留重寫的url
{
app.Context.RewritePath(requestedPath, string.Empty, string.Empty);//這里查詢參數我沒去處理了,也就是Request.QueryString的信息,如果取qeryString 然后去處理成一個字符串
return;
}
app.Context.RewritePath(virtualPath, string.Empty, app.Context.Request.QueryString.ToString());//其它文件則使用找到的路徑
}
///<summary>
/// 獲取url對應的絕對路徑和虛擬路徑及查詢參數
///</summary>