加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – RouteCollection.Ignore和RouteCollection.Ignor

发布时间:2020-12-15 23:25:40 所属栏目:asp.Net 来源:网络整理
导读:RouteCollection.Ignore(url,constraints)和RouteCollection.IgnoreRoute(url,constraints)之间有什么区别? 背景 新的MVC项目在Global.asax RegisterRoutes方法中包含此IgnoreRoute调用,以跳过对ASP.NET系统其他地方处理的.axd位置的请求的路由. routes.Ign
RouteCollection.Ignore(url,constraints)和RouteCollection.IgnoreRoute(url,constraints)之间有什么区别?

背景

新的MVC项目在Global.asax RegisterRoutes方法中包含此IgnoreRoute调用,以跳过对ASP.NET系统其他地方处理的.axd位置的请求的路由.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

我想添加一个额外的被忽略的路由到一个项目,我开始输出新的行.路线之后.I,Intellisense弹出.Ignore和.IgnoreRoute,听起来都一样.

根据MSDN文档,您可以看到一个是System.Web.Routing.RouteCollection类的实例方法,另一个是System.Web.Mvc.RouteCollectionExtensions的该类的扩展方法.

> RouteCollection.Ignore:“如果请求URL满足指定的约束,则定义不应该检查与路由匹配的URL模式”(MSDN docs).
> RouteCollection.IgnoreRoute:“忽略可用路由的给定列表的指定URL路由和约束列表”(MSDN docs).

两者都采用路由URL模式和一组限制在该URL模式上的路由的应用的约束.

解决方法

在 source for System.Web.Mvc.RouteCollectionExtensions on CodePlex之间,在我的本地GAC上运行一个 ILSpy,在System.Web.Routing.RouteCollection中,它似乎并没有区别,尽管他们似乎有完全独立的代码做同样的事情.

RouteCollection.IgnoreRoute(via CodePlex source)

public static void IgnoreRoute(this RouteCollection routes,string url,object constraints) {
    if (routes == null) {
        throw new ArgumentNullException("routes");
    }
    if (url == null) {
        throw new ArgumentNullException("url");
    }

    IgnoreRouteInternal route = new IgnoreRouteInternal(url) {
        Constraints = new RouteValueDictionary(constraints)
    };

    routes.Add(route);
}

RouteCollection.Ignore(通过ILSpy反编译)

public void Ignore(string url,object constraints) {
    if (url == null) {
        throw new ArgumentNullException("url");
    }
    RouteCollection.IgnoreRouteInternal item = new RouteCollection.IgnoreRouteInternal(url) {
        Constraints = new RouteValueDictionary(constraints)
    };
    base.Add(item);
}

差异

唯一真正的区别是位置明显的区别,一个是RouteCollection类本身的一个实例方法,一个是该类的一个扩展方法.考虑到实例与扩展执行之间的代码差异(例如扩展实例中的重要的空值检查),它们看起来是相同的.

在他们的核心,他们都使用完全相同的StopRoutingHandler类.两者都有自己的版本的密码IgnoreRouteInternal类,但这些版本在代码中是相同的.

private sealed class IgnoreRouteInternal : Route {
    public IgnoreRouteInternal(string url)
        : base(url,new StopRoutingHandler()) {
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext,RouteValueDictionary routeValues) {
        return null;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读