原創(chuàng)|其它|編輯:郝浩|2009-10-19 10:23:10.000|閱讀 494 次
概述:需求:某網(wǎng)站因業(yè)務(wù)擴展,需拆分出另一個站點,新舊站點具有相同的內(nèi)容,但具體欄目表現(xiàn)形式上不一樣。原網(wǎng)站運行多年,有大量的圖片,這些圖片也會在新站上使用。任務(wù)是:保證兩個網(wǎng)站圖片內(nèi)容同步,即原來的站點增加一個圖片,新站點即可使用這個圖片。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
需求:某網(wǎng)站因業(yè)務(wù)擴展,需拆分出另一個站點,新舊站點具有相同的內(nèi)容,但具體欄目表現(xiàn)形式上不一樣。原網(wǎng)站運行多年,有大量的圖片,這些圖片也會在新站上使用。任務(wù)是:
保證兩個網(wǎng)站圖片內(nèi)容同步,即原來的站點增加一個圖片,新站點即可使用這個圖片。
分析:假設(shè)兩個站點的域名分別為:和
1、 將圖片分別拷到兩臺服務(wù)器,以后上傳圖片同時上傳兩臺服務(wù)器。這種方法雖簡單,但是占用巨大的磁盤空間,而且維護麻煩。
2、 在的頁面上直接寫的引用。這種方式類似“圖片盜鏈”,但工作量也很大,每加一個圖片都要改鏈接。日后維護工作也很大。
3、 一臺服務(wù)器保留圖片,另外一臺服務(wù)器通過IIS的網(wǎng)絡(luò)共享方式訪問圖片。但開放文件共享對服務(wù)器的安全將構(gòu)成威脅。
剖析頁面運行原理:
當(dāng)瀏覽器向IIS請求頁面時,IIS會把請求轉(zhuǎn)交給ASP.NET HTTP管道,HTTP管道是一組被控對象(HTPPModel),這些對象按順序處理請求并把這些請求轉(zhuǎn)換成一般的HTML文本。HTTP管道的入口是HttpRuntime類的實體。HttpRuntime類實體從內(nèi)存程序池中選擇一個HttpApplication對象,HttpApplication的主要工作是尋找這樣的類實體(HttpHandler)使之能夠處理請求。應(yīng)用程序能在Web.Config里對這個Http處理句柄映射列表進(jìn)行重定義。下列Web.config中的句柄,定義了.jpg資源請求的處理句柄:
<httphandlers>
<add verb=”*” path=”*.jpg” type=”HandlerTest”/>
</httphandlers>
Verb列表可以是逗號分隔的HTTP謂詞列表(例如“GET,PUT,POST”),也可以是通配符“*”;path路徑屬性可以包含單個URL路徑或簡單的通配符字符串(例如*.aspx);type指定逗號分隔的類/程序集組合。ASP.NET首先在應(yīng)用程序的專用\bin目錄中搜索程序集DLL,然后在系統(tǒng)程序集緩存中搜索程序集DLL。
從代碼層面來看,要實現(xiàn)自定義的HTTP處理句柄,只需要實現(xiàn)一個IhttpHandler接口,其中包括IsReusable和ProcessRequest兩個方法。IsReusable方法用于返回應(yīng)用程序池中是否存在可重用的類實體的信息,利用這個方法可以同時為多個請求服務(wù),而ProcessRequest方法則接受一個HttpContext實體作為參數(shù),從而得到對Request和Response的存取權(quán)限。
處理思路:當(dāng)對的請求到達(dá)IIS時,ASP.NET初始化一個圖像生成器類,在這個類中,通過HTTP端口把取回來,再將圖像流返回到HTTP響應(yīng)中。接收并處理HTTP請求是在ProcessRequest方法中完成的。客戶端并不知道實際發(fā)生了什么事情。
代碼:
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 , then changed to request
url = url.Replace("", "");
//如果使用的相對路徑,就要手工加入完整的url路徑
if (url.IndexOf("") <= 0)
{
url = "" + url;
}
//create one WebClient object, used to request the image of
WebClient client = new WebClient();
Stream stream = client.OpenRead(url);
Image image = Image.FromStream(stream);
context.Response.ContentType = "image/jpeg";
//將圖像寫入HTTP響應(yīng),返回給客戶端請求
image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
image.Dispose();
}
public bool IsReusable
{
get
{
return true;
}
}
}
}
配置:
1、 將上面的代碼編譯為ImageLink.dll,在b服務(wù)器建立和a機器相同路徑的圖片目錄images,并在其下建立bin目錄,將ImageLink.dll拷進(jìn)去,在b服務(wù)器中吧images目錄設(shè)定為一個應(yīng)用程序,這樣才能針對此應(yīng)用程序設(shè)定相應(yīng)的程序映射(添加相應(yīng)的擴展),以把jpg后綴的請求發(fā)送到ASP.NET去處理。
2、 在Web.Config中配置代碼來設(shè)定httpHandlers,我們現(xiàn)在要做的把對images目錄下的jpg文件的請求轉(zhuǎn)到ImageLink來處理,因此最終的設(shè)定如下:
<httphandlers>
<add verb=”*” path=”images/*.jpg” type=” WebHttpModule.ImageLink, ImageLink”/>
</httphandlers>
將web.config拷到images目錄下。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園