您的位置:首页 > 编程语言 > ASP

ASP.net 的URL路由选择(System.Web.Routing.dll)

2009-05-07 21:17 465 查看
System.Web.Routing是.net 3.5sp1中新增的一个dll,用它提拱的类可以很方便的实现url的映射,在asp.net WebFrom的编程中可以使客户端请求的URL变得更加的"酷",当然它的最大作用应该还是服务于ASP.net MVC的框架中。

UrlRouting 的实现原理实际上并不复杂,在System.Web.Routing空间中有一个类 UrlRoutingModule,它实现了IHttpModule接口,并订阅了HttpApplication对象的PostResoleRequestCache与PostMapRequestHandler两个事件,在第一个事件中UrlRoutingModule为本次请求准备一个HttpHandler并在第二个事件中将HttpHandler交给HttpContext。其中PostResolveRequestCache的部分代码如下:

private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
{
HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);
this.PostResolveRequestCache(context);
}

public virtual void PostResolveRequestCache(HttpContextBase context)
{
RouteData routeData = this.RouteCollection.GetRouteData(context);
if (routeData != null)
{
IRouteHandler routeHandler = routeData.RouteHandler;
if (routeHandler == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
}
if (!(routeHandler is StopRoutingHandler))
{
RequestContext requestContext = new RequestContext(context, routeData);
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
if (httpHandler == null)
{
throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));
}
RequestData data2 = new RequestData();
data2.OriginalPath = context.Request.Path;
data2.HttpHandler = httpHandler;
context.Items[_requestDataKey] = data2;
context.RewritePath("~/UrlRouting.axd");
}
}
}
代码说明:

1. HttpContextBase是一个抽象类,它的成员与HttpContext是完全一样的,HttpContextWrapper继承于HttpContextBase,并且将HttpContext对象作为自己的一个成员,它的方法实现完全是依赖于HttpContext对象来实现的。HttpContextBase与HttpContextWrapper都是在System.Web.Abstractions.dll中,这个DLL也是.net sp1新增的,它的主要作用是服务于asp.net 的单元测试。

2. RouteData是与于当前请求URL配置相对应的一个路由数据。URL路由类Route是要我们来配置的并将其添加到RouteTable的Routes集合中,RouteTable使用了SingleTon设计模式,所以它是线程安全的并且整个应用程序共用一个RouteTable对象,因此我们要向RouteTable添加Route时必须在Global.asax的Application_Start事件中完成。

3. 方法从RouteData中获取获取一个RouteHandler对象,这个对象是IRouteHandler接口的实现,在.net sp1中并没有可以直接使用的IRouteHandler的实现,所以需要我们自己实现,实现它的目的也就是创建一个当前Route的可用的HttpHandler.

PostMapRequestHandler的代码实现:

private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
{
HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);
this.PostResolveRequestCache(context);
}

public virtual void PostMapRequestHandler(HttpContextBase context)
{
RequestData data = (RequestData) context.Items[_requestDataKey];
if (data != null)
{
context.RewritePath(data.OriginalPath);
context.Handler = data.HttpHandler;
}
}

代码说明:就是将上面获得的HttpHandler对象交给HttpContext的Handler属性。

如果我要在ASP.net WebFrom中用使用UrlRoute必须完成三件事:

1.实现IHttpHandler接口

2.实现IRouteHandler接口,根据RequestContext的RouteData属性返回相对应的IHttpHandler对象

3.配置Route路由将IRouteHandler对象赋给Route对象的Handler,并将Route添加到RouteTable的Routes集合中

下面我们就可以在ASP.net WebFrom中使用URLRouting并让我们的URL变得更"酷"(待续……)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐