关于“验证码的制作”的一些补充
上次写了点关于验证码制作的代码,算是学习了Drawing中的一些东西,心里很快活,也乐意为大伙儿做些善事,于是便萌发了把验证码封装成简单的控件发布出去的念头——起初是用ashx(一般处理程序,俗称Httphander)的做法,OK。在WebForm和MVC两种情况下毫无问题——代码很简单,假设把ashx放在程序根目录,那么你就在页面中对应弄上一个img即可:
<img src="/Image.req"/>
这样生成img标签自动也会请求这个handler,生成图片(不要忘记配置handler就可以了)。
然后我想到要做一个dll,因为总觉得把ashx发布出去不是很正规(别人都是发布dll的嘛,呵呵),于是我自己创建了一个类库(ClassLibrary),创建对应的类,实现了IHttpHandler和IRequiresSessionState(拷贝原先ashx中正确的代码,也就是上一篇的代码全部)。然后编译成dll组件,在web.config的<httpHandlers>进行恰当的配置:
<configuration>
<system.web>
<!---Httphandler's configuration here……-->
<httpHandlers>
<add path="*.req" verb="*" type="TestLibrary.DrawImage"/>
</httpHandlers>
………………
然后在WebForm和MVC中同时实验——结果很奇怪:在WebForm一切照旧正常,可是MVC程序中死活就是红叉叉报错(显示不出图片,郁闷中……)
后来多方请教,直到遇到了大神imran_ku07之后我才恍然大悟(看到 http://forums.asp.net/t/1800318.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 } // 参数默认值
);
}
相关新闻>>
- 发表评论
-
- 最新评论 更多>>