熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

關於“驗證碼的制作”的一些補充

2013-11-13 10:13:19  來源: .NET編程 
    上次寫了點關於驗證碼制作的代碼算是學習了Drawing中的一些東西心裡很快活也樂意為大伙兒做些善事於是便萌發了把驗證碼封裝成簡單的控件發布出去的念頭起初是用ashx(一般處理程序俗稱Httphander)的做法OK在WebForm和MVC兩種情況下毫無問題代碼很簡單假設把ashx放在程序根目錄那麼你就在頁面中對應弄上一個img即可
   
    <img src=/Imagereq/>
   
    這樣生成img標簽自動也會請求這個handler生成圖片(不要忘記配置handler就可以了)
   
    然後我想到要做一個dll因為總覺得把ashx發布出去不是很正規(別人都是發布dll的嘛呵呵)於是我自己創建了一個類庫(ClassLibrary)創建對應的類實現了IHttpHandler和IRequiresSessionState(拷貝原先ashx中正確的代碼也就是上一篇的代碼全部)然後編譯成dll組件在nfig的<httpHandlers>進行恰當的配置
   
    <configuration>
   
    <systemweb>
   
    <!Httphandlers configuration here……>
   
    <httpHandlers>
   
    <add path=*req verb=* type=TestLibraryDrawImage/>
   
    </httpHandlers>
   
    ……
   
    然後在WebForm和MVC中同時實驗結果很奇怪在WebForm一切照舊正常可是MVC程序中死活就是紅叉叉報錯(顯示不出圖片郁悶中……)
   
    後來多方請教直到遇到了大神imran_ku之後我才恍然大悟(看到/t/aspx這篇類似的問題)原來當你寫/Imagereq的時候默認路由就會按照Controller/Action/DefaultOptionalValue去匹配這樣的話Controller就變成了Imagereq自然沒有這個Controller然後自然報錯(圖片無法出來)
   
    解決辦法就是讓這個路徑不要通過默認的Route方式解析使用IgnoreRoute方式排除這個路徑(粗體)
   
    [C#]
   
    public class MvcApplication : SystemWebHttpApplication
   
    {
   
    public static void RegisterRoutes(RouteCollection routes)
   
    {
   
    routesIgnoreRoute({resource}axd/{*pathInfo}
   
    routesIgnoreRoute({resource}req/{*pathInfo}
   
    routesMapRoute(
   
    Default // 路由名稱
   
    {controller}/{action}/{id} // 帶有參數的 URL
   
    new { controller = Default action = Index id = UrlParameterOptional } // 參數默認值
   
    )
   
    }
   
    protected void Application_Start()
   
    {
   
    AreaRegistrationRegisterAllAreas()
   
    RegisterRoutes(RouteTableRoutes)
   
    }
   
    }
   


    [VBNET]
   
    Public Class MvcApplication
   
    Inherits SystemWebHttpApplication
   
    Public Shared Sub RegisterRoutes(routes As RouteCollection)
   
    routesIgnoreRoute({resource}axd/{*pathInfo}
   
    routesIgnoreRoute({resource}req/{*pathInfo}
   
    路由名稱
   
    帶有參數的 URL
   
    參數默認值
   
    routesMapRoute(Default {controller}/{action}/{id} New With { _
   
    ntroller = Default _
   
    Key action = Index _
   
    Key id = UrlParameter[Optional] _
   
    })
   
    End Sub
   
    Protected Sub Application_Start()
   
    AreaRegistrationRegisterAllAreas()
   
    RegisterRoutes(RouteTableRoutes)
   
    End Sub
   
    End Class
   
    這樣一來果然在ASP mvc中也可以咯!神啦!
   
    福無雙至禍不單行下午某時有個中軟的程序員找我詢問關於如何屏蔽MVC插件的事情(它的項目根目錄有plugin文件夾然後裡邊有大量其它重要文件現在不想要別人訪問)我想了以下給了兩個解決方案
   
    )在根目錄nfig中配置如下(相對於根目錄的子目錄plugin中後面子文件夾和文件均無法訪問)
   
    <systemweb>
   
    <httpHandlers>
   
    <add path=/plugin/* verb=* type=SystemWebHttpNotFoundHandler/>
   
    </httpHandlers>
   
    ……
   
    )拷貝一個nfig文件到plugin文件夾中然後這樣配置(表示當前文件夾中所有子文件夾和文件均無法訪問)
   
    <systemweb>
   
    <httpHandlers>
   
    <add path=* verb=* type=SystemWebHttpNotFoundHandler/>
   
    </httpHandlers>
   
    ……
   
    他的問題是解決了我又冒出新問題了既然MVC可以通過//localhost/文件夾名/文件的形式直接訪問文件那麼它為什麼不會把文件夾名解析成Controller文件解析成Action呢?我猜想如下
   
    )任何網頁程序默認潛規則解析是根據地址欄輸入的虛擬路徑尋找對應的文件(傳統ASPNET Web也不例外)因此MVC也有此潛規則如果地址欄輸入的虛擬路徑恰好可以映射找到真實的文件那麼直接返回結果就不會在Route了
   
    )如果找不到
   
    )嘗試Route(按照默認或者其它定義規則//localhost/{Controller}/{Action}/DefaultOptionalParameter)進行解析
   
    )如果解析成功那麼返回Action中對應的View解析失敗拋出異常
   
    )如果某個請求地址(比如Imagereq純粹是一個ashx請求真實文件路徑均不存在)直接使用Route規則匹配肯定錯誤此時你就應該告知系統這是例外(用IgnoreRoute即可)


From:http://tw.wingwit.com/Article/program/net/201311/12959.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.