URL路由模块

 书接上回[译]Asp.net MVC 之 Contorllers(一)

URL 路由HTTP模块通过获取 URL,然后调用合适的执行方法处理进来的请求。URL 路由 HTTP 模块取代了旧版本 ASP.NET 的 URL 重写功能。URL 重写的核心包括获取请求、解析原始 URL 以及指导 HTTP 运行时环境服务于“可能相关但不同(possibly related but different)” 的 URL。

 

取代URL重写

在可读性、搜索引擎优化(SEO,search engine optimization)和程序处理 UR L的数量级之间做出权衡时,URL重写就可以闪亮登场了。思考一下这个URL:

http://northwind.com/news.aspx?id=1234

news.aspx页面集成了检索信息、组织信息以及显示信息的所有逻辑。这个 ID 是 Querystring 中的参数,根据他可以获取特定的消息。对于程序猿,实现这个页面,非常easy。

只需要简单的三个步骤(相当于把大象装冰箱):

  1. 获取到 Query String 中参数 ID 值(打开冰箱门)。
  2. 运行一个查询语句获取结果(把大象放进去)。
  3. 创建一个展示的界面(关上冰箱门)。

对于用户和搜索引擎来说,单纯从URL很难真正的理解这个页面是干什么的,而且很难记清楚网址以及具体需要传的值。

URL重写在两个方面上做了改善:

首先、程序猿可以用一个通用的前端页面(如:news.aspx)显示相关内容。

其次、用户可以请求更加友好的URL,这些URL被程序通过代码自动映射成不那么直观但又便于管理的URL上。

总的来说,URL 重写就实现服务于请求的物理页面与请求URL的解耦。

在 ASP.NET 4 Web Forms 最新版本中,可以使用 URL 路由将传入的 URLs 匹配其他 URLs 而不会产生 HTTP 302 重定向的消耗。然而,在 ASP.NET MVC 中,URL 路由是把传入的 URL 映射到 Controller 类和 Action 方法为目的的。

注 最初开发 URL 路由模块的目的是作为一个 ASP.NET MVC 组件,现在已经是 ASP.NET 平台的一部分,只是 ASP.NET MVC 和 ASP.NET Web Forms 提供的 API 稍有不同。

 

路由请求

向IIS发出请求的时候,究竟发生了什么呢?

下图给出了在 ASP.NET MVC 和 ASP.NET Web Forms 应用程序中涉及相关的各个步骤如何工作的总体图。

 [译]Asp.net MVC 之 Contorllers(二)

URL路由模块会拦截无法由IIS服务处理的应用程序的任何请求。如果URL是指向一个物理文件(例如,一个ASPX文件) ,那么路由模块将忽略该请求,除非另行配置。在页面处理程序方面,ASP.NET 机制正常处理该请求。

接着,URL路由模块尝试匹配所有应用程序定义的路由的URL。如果匹配到,请求将转到 ASP.NET MVC 的领地,再调用一个控制器类进行处理。如果没有匹配到,请求将被标准的 ASP.NET 运行时以最合适的方式处理,很可能的结果就是返回一个404。

最后,只有符合预定义的 URL 格式(也就是路由)的请求,才被允许享用 ASP.NET MVC 运行时的服务。所有这些请求都被路由到一个共同的序实例化控制器类的HTTP处理程,并调用其中定义的方法。接下来,控制器方法将选择一个视图组件,生成实际的响应。

 

URL路由模块的内部结构

从实现角度讲,我们应该注意到 URL 路由引擎是一个触发 PostResolveRequestCache 事件的 HTTP 模块。在 ASP.NET 缓存中先检查,如果对于请求没有可用的响应,之后就会触发该事件。

HTTP 模块匹配到用户定义的 URL 路由请求的 URL,并将 HTTP 上下文设置为使用 ASP.NET MVC 标准的 HTTP 处理程序来处理该请求。作为程序猿,不可能直接处理 URL 路由模块。该模块由系统提供,不需要我们特别去配置。我们的责任是提供应用程序支持的路由,以及路由模块实际使用的路由。

 

应用程序路由

按照设计,ASP.NET MVC 应用程序并没有依赖于物理页面。在 ASP.NET MVC 中,用户请求代理资源(acting on resources)。然而,框架没有规定描述资源和 Action 的语法。表达为"代理资源(acting on resources)",很可能会被认为是 REST。,当然,这样想也不是很离谱。

可以使用 ASP.NET MVC 应用程序中的 REST 方式,ASP.NET MVC 面向他是松耦合的,ASP.NET MVC 承认他的概念,如资源和行为,我们可以随意使用自己的语法来表达和实现资源和行动行为。例如,在一个纯粹的 REST 解决方案,是使用H TTP 谓词来表达行为动作(GET,POST,PUT和DELETE)和通过URL识别资源。可以在在 ASP.NET MVC 中实现一个纯粹的 REST 的解决方案,但需要做一些额外的工作。

通过指定动作行为和资源可以自定义语法,在 ASP.NET MVC 中默认行为是使用自定义语法的 URLs。该语法是以 URL 模式的集合作为表现形式,也称为路由。

 

URL模式和路由

路由是URL绝对路径样式匹配的字符串,也就是一个没有协议、服务和端口信息的URL字符串。路由可能是一个字符串常量,但很可能还包含一些占位符。

一个简单的路由:

/home/test

路由是一个常量字符串,并且他仅被一个路径是 home/test 的 URL 匹配。然而,大多数时候,我们处理的是包含一个或多个占位符的参数化路由。

请看下面两个例子:

/{resource}/{action}

/Customer/{action}

这两个路由都可以被任何只有两个部分的 URL 匹配。第二个要求第一段是字符串 “Customer”。然而,第一个没有对每段内容做出具体限制。

通常,大括号{}内的占位符被称为 URL 参数。只要 URL 参数是由常量或分隔符隔开,路由就可以有多个 URL 参数。正斜杠(/)字符作为路由各个部分之间的分隔符。占位符的名字(例如,action)是代码在实际 URL 中检索相应段的内容的关键。

下面是ASP.NET MVC 应用程序中默认路由:

{controller}/{action}/{id}

上面路由包含三个占位符,其中由分隔符分开。下面是一个匹配上面路由的一个URL:

/Customers/Edit/ABC

我们可以添加多个路由,并且给路由添加多个占位符,也可以删除该默认路由。

 

定义应用程序路由

应用程序的路由通常注册在global.asax文件中,他在应用程序启动时被处理。

global.asax文件中处理路由的部分:

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            ...
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            ...
        }
    }
MvcApplication

相关文章:

  • 2021-10-12
  • 2022-01-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-29
  • 2021-06-26
猜你喜欢
  • 2021-07-19
  • 2021-12-26
  • 2022-03-01
  • 2022-12-23
  • 2021-12-14
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案