一次面試留下的實際應用問題。關於HttpModule,IIS集成模式。


資料來自《IIS7開發與管理完全手冊》

周五面試時有點緊張,沒能靜下心思考,當時隱約想到這個解決方案,但因面試環境和心態確未能明確的表述。

回家的地鐵上已經找到解決辦法。

要點:1基於IHttpModule,2IIS集成模式。

IHttpModule想必作B/S開發的人不會陌生。

IIS集成模式。是IIS7的新特性。

//圖《IIS7開發與管理完全手冊》這本書里有,懶得畫了,在園子里扒了一個。

可以看到,靜態文件是不進入MODULE的

經典模式-可以看到,靜態文件是不經過MODULE的

集成模式-不論靜態,還是動態的訪問,統一在一個管道中。

 

簡單但不嚴謹的表述:IIS6的IHttpModule只對ashx,aspx等動態文件生效,若要拓展html,css此類靜態文件的訪問,只能通過WINDOWS權限控制,開發人員無法自行定義。IIS7新加入了集成模式,將所有的request統一在一個管道中,並向開發人員開放。

應用場景如下:基於ASP.NET平台MVC架構的網站,默認Index.html為首頁,每小時根據最新數據,重建該頁面,而此時會影響對該頁面的訪問,個人未處理過此種場景,理解上重建文件時文件會加鎖,B端訪問該文件或許會報文件正操作之類的錯誤。(如理解錯誤請指出)

 

操作流程

1文件根路徑定義兩個文件 index.html,index2.html

2移除黙認的路由RouteConfig(移除后,對網站根路徑的訪問會因此定義到Index.html)

 

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        }
    }

3建立自定義MODULE

  public class TestMoudle:IHttpModule
    {
        public void Dispose()
        {
            //throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
          //  throw new NotImplementedException();
            context.BeginRequest += context_BeginRequest;
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpContext ctx = HttpContext.Current;
            string hostname = ctx.Request.UserHostName;
            string requesturl = ctx.Request.RawUrl;
            //主頁放兩個文件,index.html index2.html
            //在Application["Creating"]設置標志位  Application微軟應有同步處理方案,若不放心,自已定一個。
            //每小時置Creating為true,重生成Index.html,Index.html生成成功后,置Creating為false 重寫index2.html
           
            //訪問路徑若為/或index.html
            if (requesturl == "/" || requesturl=="/index.html")
            {
                //若正在生成,在定向到index2.html
                //var creating=(bool)ctx.Application["creating"];
                bool creating = DateTime.Now.Second % 2==0;
                if (creating)
                {
                    ctx.RewritePath("index2.html");
                }
            }
        }
    }
View Code

 

4WEB.CONFIG system.web添加模塊配置。

<httpModules>
      <add name="TestModule" type="Index.Controllers.TestMoudle,Index"></add>
    </httpModules>

5發布網站到IIS(IIS7以上)

   IIS7的設置部分

6添加一項集成模式的應用程序池

7設置發布網站的應用程序池為定義的集成模式(本例為.Net v4.5)

8進入模塊配置(只在WEB.CONFIG配置並不生效),添加自定義的模塊

9添加模塊成功后,重啟該站點,訪問即可見效果。

 

PS:因為所有的訪問都要經過一個新的MODULE,所以會有部分的性能損耗。

對網站根及index.html的訪問,會根據時間(模擬index.html是否正在被重建)定向到index2.html。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM