存档

文章标签 ‘ashx’

在Webform (asp.net)中使用Route 路由之初级扩展

2012年9月7日 没有评论

在上一节,我们分享了如何实现基本的路由,可以满足很多的场景。

对于asp.net 稍微熟悉的同学一定不会对 Ashx 文件陌生,这是一个只具有代码逻辑的页面,通常用在验证码显示、文件下载等几乎没有用户界面的情况下。我就非常地喜欢使用这样的文件。

有的同学在对这样的文件进行路由的时候,会是这么来写代码,routes.MapPageRoute (“data”, “data”, “~/handler.ashx”); 编译一运行,我瓷熬,居然报错了。报错信息是什么呢?大致是这样的一条错误信息:类型“WebSite.Handler”不从“System.Web.UI.Page”继承。原因就在于常见的 aspx 和 ashx 虽然都实现了 IHttpHandler 接口,但是又不完全一样。

为了解决这个问题,其实这个问题也是我写这几篇文章最初的出发点,网上的代码基本上和上一节的差不多,并没有解决本节的问题。

我们在项目中新建一个类,取名 PageRoute,继承自 IRouteHandler 。在这个类里,我们只需要实现 IRouteHandler 接口就可以了。不多说,上代码。
#region IRouteHandler 成员

public string RoutePath { get; private set; }

public PageRoute (string routePath){RoutePath = routePath;}

public IHttpHandler GetHttpHandler (RequestContext requestContext)
{
if (!RoutePath.Contains (“.ashx”))
{
return BuildManager.CreateInstanceFromVirtualPath (RoutePath, typeof (Page)) as IHttpHandler;
}
else
{
return BuildManager.CreateInstanceFromVirtualPath (RoutePath, typeof (IHttpHandler)) as IHttpHandler;
}
}

#endregion

从代码里,可以清楚地看到,在 GetHttpHandler 方法里分别对 aspx 和 ashx 文件进行了处理,虽然返回的都是 IHttpHandler ,但是在转换的时候,设置的 typeof  是不一样的。

接下来,在 Global.asax.cs 里这么来写 routes.Add (“getdata”, new Route (“data”, new PageRoute (“~/handler.ashx”))); 各位同学们要记住这里的写法和上一节里的写法不一样喔。这样就可以实现对 ashx 文件的路由了,当然对于 aspx 文件,使用2种方式都可以的,例如 routes.Add (“user”, new Route (“u/{userid}”, new PageRoute (“~/userlist.aspx”))); 这样

是不是很神奇呀?

在这一节里,我们就完全解决了传统 webform 的路由实现问题,特别是不从“System.Web.UI.Page”继承这个问题。下一节我们来提一提再高级一点的用法。

分类: 日常 标签: , ,