上次寫了點關於驗證碼制作的代碼
算是學習了Drawing中的一些東西
心裡很快活
也樂意為大伙兒做些善事
於是便萌發了把驗證碼封裝成簡單的控件發布出去的念頭
起初是用ashx(一般處理程序
俗稱Httphander)的做法
OK
在WebForm和MVC兩種情況下毫無問題
代碼很簡單
假設把ashx放在程序根目錄
那麼你就在頁面中對應弄上一個img即可
<img src=
/Image
req
/>
這樣生成img標簽自動也會請求這個handler
生成圖片(不要忘記配置handler就可以了)
然後我想到要做一個dll
因為總覺得把ashx發布出去不是很正規(別人都是發布dll的嘛
呵呵)
於是我自己創建了一個類庫(ClassLibrary)
創建對應的類
實現了IHttpHandler和IRequiresSessionState(拷貝原先ashx中正確的代碼
也就是上一篇的代碼全部)
然後編譯成dll組件
在nfig的<httpHandlers>進行恰當的配置
<configuration>
<system
web>
<!
Httphandler
s configuration here……
>
<httpHandlers>
<add path=
*
req
verb=
*
type=
TestLibrary
DrawImage
/>
</httpHandlers>
……
然後在WebForm和MVC中同時實驗
結果很奇怪
在WebForm一切照舊正常
可是MVC程序中死活就是紅叉叉報錯(顯示不出圖片
郁悶中……)
後來多方請教
直到遇到了大神imran_ku
之後我才恍然大悟(看到/t/
aspx這篇類似的問題)
原來當你寫
/Image
req
的時候
默認路由就會按照
Controller/Action/DefaultOptionalValue
去匹配
這樣的話
Controller就變成了
Image
req
自然沒有這個Controller
然後自然報錯(圖片無法出來)
解決辦法就是讓這個路徑不要通過默認的Route方式解析
使用IgnoreRoute方式排除這個路徑(粗體)
[C#]
public class MvcApplication : System
Web
HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes
IgnoreRoute(
{resource}
axd/{*pathInfo}
)
routes
IgnoreRoute(
{resource}
req/{*pathInfo}
)
routes
MapRoute(
Default
// 路由名稱
{controller}/{action}/{id}
// 帶有參數的 URL
new { controller =
Default
action =
Index
id = UrlParameter
Optional } // 參數默認值
)
}
protected void Application_Start()
{
AreaRegistration
RegisterAllAreas()
RegisterRoutes(RouteTable
Routes)
}
}
[VB
NET]
Public Class MvcApplication
Inherits System
Web
HttpApplication
Public Shared Sub RegisterRoutes(routes As RouteCollection)
routes
IgnoreRoute(
{resource}
axd/{*pathInfo}
)
routes
IgnoreRoute(
{resource}
req/{*pathInfo}
)
路由名稱
帶有參數的 URL
參數默認值
routes
MapRoute(
Default
{controller}/{action}/{id}
New With { _
ntroller =
Default
_
Key
action =
Index
_
Key
id = UrlParameter
[Optional] _
})
End Sub
Protected Sub Application_Start()
AreaRegistration
RegisterAllAreas()
RegisterRoutes(RouteTable
Routes)
End Sub
End Class
這樣一來
果然在ASP mvc中也可以咯!神啦!
福無雙至
禍不單行
下午某時有個中軟的程序員找我詢問關於如何屏蔽MVC插件的事情(它的項目根目錄有plugin文件夾
然後裡邊有大量其它重要文件
現在不想要別人訪問)
我想了以下
給了兩個解決方案
)在根目錄nfig中配置如下(相對於根目錄的子目錄
plugin中後面子文件夾和文件均無法訪問)
<system
web>
<httpHandlers>
<add path=
/plugin/*
verb=
*
type=
System
Web
HttpNotFoundHandler
/>
</httpHandlers>
……
)拷貝一個nfig文件到plugin文件夾中
然後這樣配置(表示當前文件夾中所有子文件夾和文件均無法訪問)
<system
web>
<httpHandlers>
<add path=
*
verb=
*
type=
System
Web
HttpNotFoundHandler
/>
</httpHandlers>
……
他的問題是解決了
我又冒出新問題了
既然MVC可以通過
//localhost/文件夾名/文件
的形式直接訪問文件
那麼它為什麼不會把
文件夾名
解析成Controller
文件
解析成Action呢?我猜想如下
)任何網頁程序默認
潛規則
解析是根據地址欄輸入的虛擬路徑尋找對應的文件(傳統ASP
NET Web也不例外)
因此MVC也有此潛規則
如果地址欄輸入的虛擬路徑恰好可以映射找到真實的文件
那麼直接返回結果
就不會在Route了
)如果找不到
)嘗試Route(按照默認或者其它定義規則//localhost/{Controller}/{Action}/DefaultOptionalParameter)進行解析
)如果解析成功
那麼返回Action中對應的View
解析失敗
拋出異常
)如果某個請求地址(比如Image
req純粹是一個ashx請求
真實文件路徑均不存在)
直接使用Route規則匹配肯定錯誤
此時你就應該告知系統
這是例外
(用IgnoreRoute即可)
From:http://tw.wingwit.com/Article/program/net/201311/12959.html