程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET 頁面aspx之擴展

ASP.NET 頁面aspx之擴展

編輯:.NET實例教程


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

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

  分析:假設兩個站點的域名分別為: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/
            url = 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機器取到,在客戶端卻看不出來。

本文作者:未知

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved