詳解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資源請求的處理控制程式碼:
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來處理,因此最終的設定如下:
將web.config拷到images目錄下。
到此大工就告成了!所有對b伺服器請求的jpg圖片都會從a機器取到,在客戶端卻看不出來。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-683050/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASP.NET 頁面aspx之擴充套件ASP.NET套件
- Istio Proxy【Envoy擴充套件】詳解套件
- ASP.NET Core擴充套件庫之Http通用擴充套件ASP.NET套件HTTP
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- asp.net RadGrid分頁功能擴充套件DemoASP.NET套件
- 擴充套件中國剩餘定理詳解套件
- JWT 擴充套件具體實現詳解JWT套件
- Asp.Net中ajax+aspx使用詳解ASP.NET
- 圖解Dubbo,6 種擴充套件機制詳解圖解套件
- Less(v3.9.0)使用詳解—extend(擴充套件)套件
- SpringBoot各類擴充套件點詳解Spring Boot套件
- ASP.NET Core擴充套件庫之日誌ASP.NET套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 寫介面的藝術: 精簡,可擴充套件套件
- ASP.NET擴充套件庫之Http日誌ASP.NET套件HTTP
- WCF擴充套件:行為擴充套件Behavior Extension套件
- Solon詳解(五)- Solon擴充套件機制之Solon Plugin套件Plugin
- spring 掃描BeanDefinition詳解以及TypeFilter擴充套件點SpringBeanFilter套件
- PHP FFI詳解 - 一種全新的PHP擴充套件方式PHP套件
- Laravel容器延遲載入以及Auth擴充套件詳解Laravel套件
- Linux基本命令詳細講解和擴充套件Linux套件
- [外掛擴充套件]單頁管理外掛套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- Sanic 擴充套件套件
- ORACLE 擴充套件Oracle套件
- 擴充套件工具套件
- 擴充套件歐幾里得套件
- DOM擴充套件套件
- 擴充套件ACL套件
- Lua擴充套件套件
- 照片擴充套件套件
- 擴充套件篇套件
- disable or 擴充套件套件
- 擴充套件表套件
- Mybatis擴充套件MyBatis套件
- 官方Chrome擴充套件頁面無法訪問解決辦法Chrome套件
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- [外掛擴充套件]js版本分頁外掛套件JS