上次写了点关于验证码制作的代码算是学习了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即可) |