天天看點

詳解ASP.NET頁面的aspx擴充

我們通過本文要談談ASP.NET頁面的aspx擴充,主要是為了網站業務上的擴充,保持兩個網站圖檔内容同步。希望本文能對大家有所幫助。

需求:某網站因業務擴充,需拆分出另一個站點,新舊站點具有相同的内容,但具體欄目表現形式上不一樣。原網站運作多年,有大量的圖檔,這些圖檔也會在新站上使用。任務是:

保證兩個網站圖檔内容同步,即原來的站點增加一個圖檔,新站點即可使用這個圖檔。

分析:假設兩個站點的域名分别為:http://www.a_image.com/和http://www.b_image.com/

1、 将圖檔分别拷到兩台伺服器,以後上傳圖檔同時上傳兩台伺服器。這種方法雖簡單,但是占用巨大的磁盤空間,而且維護麻煩。

2、 在http://www.b_image.com/的頁面上直接寫http://www.a_image.com/的引用。這種方式類似“圖檔盜鍊”,但工作量也很大,每加一個圖檔都要改連結。日後維護工作也很大。

3、 一台伺服器保留圖檔,另外一台伺服器通過IIS的網絡共享方式通路圖檔。但開放檔案共享對伺服器的安全将構成威脅。

剖析頁面運作原理:

當浏覽器向IIS請求頁面時,IIS會把請求轉交給ASP.NET HTTP管道,HTTP管道是一組被控對象(HTPPModel),這些對象按順序處理請求并把這些請求轉換成一般的HTML文本。HTTP管道的入口是HttpRuntime類的實體。HttpRuntime類實體從記憶體程式池中選擇一個HttpApplication對象,HttpApplication的主要工作是尋找這樣的類實體(HttpHandler)使之能夠處理請求。應用程式能在Web.Config裡對這個Http處理句柄映射清單進行重定義。下列Web.config中的句柄,定義了.jpg資源請求的處理句柄:

<httphandlers>  <add verb=”*” path=”*.jpg” type=”HandlerTest”/>  </httphandlers> 

Verb清單可以是逗号分隔的HTTP謂詞清單(例如“GET,PUT,POST”),也可以是通配符“*”;path路徑屬性可以包含單個URL路徑或簡單的通配符字元串(例如*.aspx);type指定逗号分隔的類/程式集組合。ASP.NET首先在應用程式的專用\bin目錄中搜尋程式集DLL,然後在系統程式集緩存中搜尋程式集DLL。

從代碼層面來看,要實作自定義的HTTP處理句柄,隻需要實作一個IhttpHandler接口,其中包括IsReusable和ProcessRequest兩個方法。IsReusable方法用于傳回應用程式池中是否存在可重用的類實體的資訊,利用這個方法可以同時為多個請求服務,而ProcessRequest方法則接受一個HttpContext實體作為參數,進而得到對Request和Response的存取權限。

處理思路:當對www.b_image.com/images/book.jpg的請求到達IIS時,ASP.NET初始化一個圖像生成器類,在這個類中,通過HTTP端口把www.a_image.com/images/book.jpg取回來,再将圖像流傳回到HTTP響應中。接收并處理HTTP請求是在ProcessRequest方法中完成的。用戶端并不知道實際發生了什麼事情。

代碼:

using System;  using System.Net;  using System.IO;  using System.Web;  using System.Drawing;  using System.Drawing.Imaging;   namespace WebHttpModule  {      public class ImageLink : IHttpHandler      {          public void ProcessRequest(HttpContext context)          {              string url = context.Request.Url.ToString();              //if request is http://www.b_image.com/, then changed to request http://www.a_image.com/              urlurl = url.Replace("http://www.b_image.com/", "http://www.a_image.com/");               //如果使用的相對路徑,就要手工加入完整的url路徑              if (url.IndexOf("http://www.a_image.com/") <= 0)              {                  url = "http://www.a_image.com/" + url;              }               //create one WebClient object, used to request the image of http://www.a_image.com/              WebClient client = new WebClient();              Stream stream = client.OpenRead(url);               Image image = Image.FromStream(stream);              context.Response.ContentType = "image/jpeg";              //将圖像寫入HTTP響應,傳回給用戶端請求              image.Save(context.Response.OutputStream, ImageFormat.Jpeg);               image.Dispose();          }           public bool IsReusable          {              get              {                  return true;              }          }      }  } 

配置:

1、 将上面的代碼編譯為ImageLink.dll,在b伺服器建立和a機器相同路徑的圖檔目錄images,并在其下建立bin目錄,将ImageLink.dll拷進去,在b伺服器中吧images目錄設定為一個應用程式,這樣才能針對此應用程式設定相應的程式映射(添加相應的擴充),以把jpg字尾的請求發送到ASP.NET去處理。

2、 在Web.Config中配置代碼來設定httpHandlers,我們現在要做的把對images目錄下的jpg檔案的請求轉到ImageLink來處理,是以最終的設定如下:

<httphandlers> <add verb=”*” path=”images/*.jpg” type=” WebHttpModule.ImageLink, ImageLink”/> </httphandlers> 

将web.config拷到images目錄下。

到此大工就告成了!所有對b伺服器請求的jpg圖檔都會從a機器取到,在用戶端卻看不出來。

原文标題:ASP.NET 頁面aspx之擴充

連結:http://www.cnblogs.com/JeffreyZhao/archive/2009/10/14/aspnet-routing-design-ideas-and-patterns.html

本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/archive/2010/12/29/1921064.html,如需轉載請自行聯系原作者

繼續閱讀