2010年9月26日 星期日

透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽或下載

1.撰寫IHttpHandler處理這些檔案類型
2.設定Web.Config來註冊IHttpHandler,並且設定該資料夾Deny Users="?"
3.在IIS中註冊這些副檔名由【aspnet_isapi.dll】處理(這樣才能啟動IHttpHandler)
新增一個類別(Class),命名為CFileSafe.vb,
Imports命名空間System.Web
Implements IHttpHandler,
VS自動會產生IsReusable的Property與ProcessRequest的Sub,
接著撰寫處理Request的內容,判斷傳入的副檔名,依據不同的副檔名,
指定不同的Response.ContentType
Imports Microsoft.VisualBasic
Imports System.Web

Public Class CFileSafe
Implements IHttpHandler

Public ReadOnly Property IsReusable() ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
Get

End Get
End Property

Public Sub ProcessRequest() Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
Dim FileName As String = context.Request.FilePath
Dim tmpS() As String
tmpS = FileName.Split(".")
Dim FileExten As String = LCase(tmpS(UBound(tmpS)))
Dim GetContentType As Boolean = False
Select Case FileExten
Case "txt"
context.Response.ContentType = "text/plain"
GetContentType = True
Case "doc"
context.Response.ContentType = "application/msword"
GetContentType = True
Case "xls"
context.Response.ContentType = "application/ms-excel"
GetContentType = True
Case "ppt"
context.Response.ContentType = "application/vnd.ms-powerpoint"
GetContentType = True
Case "pdf"
context.Response.ContentType = "application/pdf"
GetContentType = True
Case "zip"
context.Response.ContentType = "application/x-zip-compressed"
GetContentType = True
Case "gif"
context.Response.ContentType = "image/gif"
GetContentType = True

Case "tif"
context.Response.ContentType = "image/tiff"
GetContentType = True

Case "jpg"
context.Response.ContentType = "image/jpeg"
GetContentType = True

End Select
If GetContentType Then
context.Response.TransmitFile(context.Request.FilePath)
'context.Response.Write(FileExten)
Else
'context.Response.Write(FileExten)
context.Response.Write("未設定檔案格式【" & FileExten & "】!!")
End If

End Sub
End Class
增加資料夾(Files),並新增Web.config來註冊IHttpHandler














最後的一個步驟→設定這些檔案格式給ISAPI處理
開啟IIS,瀏覽到我們ASP.NET應用程式中的Files資料夾,點選滑鼠右鍵→內容。
當我們要設定ISAPI的時候發現,由於他不是個應用程式,所以無法針對Files設定ISAPI,
此時我們可以先暫時把該資料夾建立為應用程式,讓他可以設定,等設定完成後再把應用程式移除即可。
接著進入設定,來看看副檔名aspx的設定為何??
將處理aspx的aspnet_isapi.dll路徑複製下來,等一下用相同的檔案來處理我們要處理的副檔名
接著新增一個副檔名的處理,我們舉txt來當作範例
1.設執行檔...aspnet_isapi.dll
2.設副檔名txt
3.選所有的指令動詞
4.取消確認檔案是否存在
接著把其他的副檔名用相同的方式設定,這個部份的畫面就省略了。
最後,Files其實不是個應用程式所以記得把應用程式移除
經過以上的設定後,再來測試看看就會發現,當瀏覽Files下的Test.txt的時候,
系統會自動導向到Login.aspx要求登入,登入完成後,自動再導回Test.txt的內容進行瀏覽。
接著測試zip也一樣,在未登入的狀況下,會要求使用者進行登入,登入完成後,
就會出現下載儲存的對話方塊。

沒有留言:

張貼留言