預設情況下http請求圖片等檔案IIS會直接提取資源並發送給用戶端,我們要建立自己的HttpHandler來處理圖片檔案。
如何?:
1.建立自己的HttpHandler
建立一個類(MyHttpHandler)繼承System.Web.IHttpHandler介面並實現相應的方法
- IsReusable 屬性(返回一個值代表其他http請求是否可以使用當前繼承了 System.Web.IHttpHander介面的類的執行個體);
- ProcessRequest(System.Web.HttpContext context)方法(用於處理使用者自訂的要被處理的特殊的http請求)。
其中的參數
System.Web.HttpContext 類的執行個體裝入了一個http請求中http協議中要求的所有資訊。其中System.Web.HttpContext 類中包含有屬性 Request 使得從用戶端發送過來的http請求資訊的值可以被方便地讀取;屬性Response ,其中封裝了需要返回給用戶端的資訊和操作。當然還有許多常用的屬性和方法,在此就不詳述了,我們這裡只用到這兩個屬性。
2.web應用程式中註冊自訂的HttpHandler
在
Web.config中加入註冊資訊
<httpHandlers><br /> <add verb="*" path="*.jpg" type = "MyHttpHandler,MyHttpHandler" /><br /></httpHandlers>
3.那麼我們看看在ProcessRequest(System.Web.HttpContext
context)方法是如何對請求圖片檔案的http請求進行處理的。
public void ProcessRequest(HttpContext context)<br /> {<br /> //判斷是否是本地引用,如果是則返回給用戶端正確的圖片,這裡的判斷就是用到了前面所述的http請求中所記路的參考頁資訊<br /> if(context.Request.UrlReferrer.Host == "localhost"){<br /> //設定用戶端緩衝中檔案到期時間為0,即立即到期。<br /> context.Response.Expires = 0;<br /> //清空伺服器端為此會話開闢的輸出緩衝<br /> context.Response.Clear();<br /> //獲得檔案類型<br /> context.Response.ContentType = getContentType(context.Request.PhysicalPath);<br /> //將請求檔案寫入到伺服器端為此會話開闢的輸出緩衝中<br /> context.Response.WriteFile(context.Request.PhysicalPath);<br /> //將伺服器端為此會話開闢的輸出緩衝中的資訊傳送到用戶端<br /> context.Response.End();<br /> }<br /> else //如果不是本地引用,則屬於盜鏈引用,返回給用戶端錯誤的圖片<br /> {<br /> context.Response.Expires = 0;context.Response.Clear();<br /> context.Response.ContentType = "image/jpg";<br /> context.Response.WriteFile(context.Request.PhysicalApplicationPath + "error.jpg");<br /> context.Response.End();<br /> }<br /> }
5 .最後在IIS裡的預設網站的“配置”裡,在“應用程式對應”裡添加映射其中映射的可執行檔為 Framework安裝路徑\aspnet_isapi.dll",副檔名為".jpg",這樣就可以了。