天天看點

asp.net位址映射——僞靜态

asp.net位址映射 的定義是使用者通路 的虛拟位址 映射的實際檔案,虛拟位址可能是靜态頁面。如理:在通路http://fuzhou.naoqiu.com/bus頁面, 其實通路的是/bus.aspx頁面。

asp.net位址映射是通過 HttpModule請求原理來完成工作。

httpModule原理是什麼?

一個HTTP請求在HttpModule容器的傳遞過程中,會在某一時刻(ResolveRequestCache事件)将這個HTTP請求傳遞給HttpHandler容器。在這個事件之後,HttpModule容器會建立一個HttpHandler的入口執行個體,但是此時并沒有将HTTP請求控制權交出,而是繼續觸發AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之後,HttpModule視窗就會将控制權暫時交給HttpHandler容器,以便進行真正的HTTP請求處理工作。

而在HttpHandler容器内部會執行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之後,會将控制權交還給HttpModule,HttpModule則會繼續對處理完畢的HTTP請求資訊流進行層層的轉交動作,直到傳回到用戶端為止。

asp.net位址映射——僞靜态

借用博友圖檔

了解完原理後,我來完成一個 簡單的位址映射,代碼如下:

  • 首先先完成位址映射基類:

    /// <summary>

    /// 位址重寫

    /// </summary>

    public abstract class BaseModuleRewriter: IHttpModule

    {

        /// <summary>

        /// 初始化調用

        /// </summary>

        /// <param name="app"></param>

        public virtual void Init(HttpApplication app) {

            app.BeginRequest += new EventHandler(app_BeginRequest);

        }

        public virtual void Dispose() { }

        /// <summary>

        /// 請求開始

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        protected virtual void app_BeginRequest(object sender, EventArgs e)

        {

            HttpApplication app = sender as HttpApplication;

            Rewrite(app);

        }

        /// <summary>

        /// 操作的抽象方法

        /// </summary>

        /// <param name="app"></param>

        protected abstract void Rewrite(HttpApplication app);

    }

  • 繼承基類,完成需要位址映射操作:

 protected override void Rewrite(HttpApplication app)

        {

            HttpContext context = app.Context;

            HttpRequest request = app.Request;

            string part = Regex.Match(request.Url.ToString(), @"(?<=http\:\/\/).*").Value.ToLower().Trim('/');

            if (part.IndexOf("/") == -1)

            {

                part = Regex.Match(part, @"^\w+").Value;

                switch (part)

                {

                    case "bus": context.RewritePath("/bus.aspx"); break;

                    case "www":

                    case "naoqiu": context.RewritePath("/Default.aspx"); break;

                    default: context.RewritePath("/Index_City.aspx"); break;

                }

            }

        }

  • 那麼我們是否還差些什麼? 是的,還差個配置檔案的配置。需要修改web.config檔案幾處地方,代碼如:

<!--請求規則-->

      <httpModules>

        <add name="BianminModuleRewriter" type="Bianmin.URLRewriter.ModuleRewriter,Bianmin.URLRewriter" />

      </httpModules>

<system.webServer>

        <handlers>

            <add name="aspnet_isapi" path="*" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv4.0,bitness64" />

        </handlers>

        <defaultDocument>

            <files>

                <clear />

                <add value="default.aspx" />

            </files>

        </defaultDocument>

    </system.webServer>

注意:當您使用framewore 2..0需要更改\aspnet_isapi.dll檔案路徑

源代碼下載下傳位址: http://download.naoqiu.com 下載下傳

繼續閱讀