返回顶部
首页 > 资讯 > 精选 >和浅析ASP.NET MVC中关于URL Rewrite的实现
  • 242
分享到

和浅析ASP.NET MVC中关于URL Rewrite的实现

2023-06-17 21:06:43 242人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关和浅析asp.net mvc中关于URL Rewrite的实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现在我们就来看一个真实案例:在ASP.net MVC中使用II

这期内容当中小编将会给大家带来有关和浅析asp.net mvc中关于URL Rewrite的实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

现在我们就来看一个真实案例:在ASP.net MVC中使用IIS级别的URL Rewrite。

在当时的文章中我谈到,URL Rewrite分有IIS级别和ASP.NET两种级别,并且各有各的特点和限制。在ASP.NET MVC中我们常用的方式是ASP.NET级别的URL Routing,它的作用是从URL中捕获数据并交给程序使用(当然还有“构造”的功能,稍候再谈)。因此,在ASP.NET MVC中我们往往不需要使用ASP.NET级别的URL Rewrite。而如今使用IIS级别的URL Rewrite,也正是因为有某些特殊问题无法回避才“不得已而为之”的。

以下涉及到的URL都以Http://51programming.com为例,这个域名已经被我泛解析为127.0.0.1,如果您需要的话可以用它来做实验。

在许多年前,一个URL的Path就是普通的路径,而动态的参数,如查询路径,是通过Query String提供的,例如:

http://51programming.com/products?keyWords=helloworld为了避免混淆,在这里我们先来澄清一些概念。什么是URL,什么是Path,而什么是QueryString。例如在上面的地址,这三者分别是:

URL:http://51programming.com/products?keywords=helloworld   Path:http://51programming.com/products   Query String:keywords=helloworld

后来SEO兴起之后,有人说这样的“动态地址”不利于搜索引擎中的权重优化,因此建议把关键字作为Path的一部分。于是就出现了这样的URL:

http://51programming.com/products/helloworld这么看来问题并不大,但是您要知道,关键字往往是由用户输入的,可能会输入特殊字符。例如,如果用户输入了“200%”作为关键字,则两种形式下的URL就分别是:

如果您尝试一下便可以知道,第一个URL可以正常访问,而第二个URL便会引发Bad Request异常:

和浅析ASP.NET MVC中关于URL Rewrite的实现

这是因为URL的Path部分出现了特殊字符,而这种字符只能出现在Query String中。

看到这个画面,您还意识到了什么信息?在定位问题的原因,以及设法解决问题的时候,首先要明确的是到底是哪里出现了问题。例如看到这个画面,您应该清楚地意识到一点:这是ASP.NET抛出的异常,换句话说,IIS并没有把它当作是非法的URL,它还是老老实实地将URL交给ASP.NET ISapi处理。因此,我们便可以动用IIS级别的URL Rewrite,在进入ASP.NET执行引擎之前,就把URL替换成可接受的形式:

RewriteRule  ^/products/([^\?]*)\?(.+)    /products?$2&keywords=$1     [I,L,U]

RewriteRule  ^/products/([^\?]*)          /products?keywords=$1     [I,L,U]***行应对的是带有Query String的情况,而第二行则是没有Query String的情况。这里用到的组件是IIRF(ionic's Isapi Rewrite Filter),这是一款开源产品,一年半前的文章里我推荐的也是这个,现在它已经有了升级。它的功能便是在进入ASP.NET ISAPI之前,就将URL重写为其他形式:

和浅析ASP.NET MVC中关于URL Rewrite的实现

原本在第3步会出现的Bad Request,由于已经在第2步被URL Rewrite成合法的形式。因此剩余的处理也就没有任何问题了。

这些内容在一年半前的文章内已经提过,不过现在既然有了ASP.NET MVC,则事情又变得更为复杂。因为ASP.NET Routing除了“匹配”URL的功能之外,还担负着“组装”URL的职责。因此,让ASP.NET Routing能够识别出Rewrite后的URL不难,但是如何同时让它又可以“组装”出Rewrite前的URL,这就需要一些小技巧了。例如以下的Route配置只能识别出URL输入(/products?keywords=xxx)但不能组装出我们需要的URL(/products/xxx):

routes.MapRoute(      "Product.List",      "products",      new { controller = "Product", action = "List" });

因此,我们必须这么做:

routes.MapRoute(      "Product.List",      "products/{*keywords}",      new { controller = "Product", action = "List", keywords = "" });

请注意我们让keywords匹配Path后端全部内容,而由于我们又提供了keywords的默认值,因此即使是“/products”这样的Path输入,也能正确匹配到这条Route规则——只不过此时的Route Value中的keywords字段已经不是用户输入的内容了(因为用户输入的/products/xxx,已经被重写为/products?keywords=xxx)。换句话说,如果有如下的Action,那么它的keywords参数则永远是空字符串

public ActionResult List(string keywords) { ... }幸好,ASP.NET MVC中存在Model Binder机制,我们可以编写一个Model Binder来指定这个参数的获取位置:

public class FroMQueryBinder : IModelBinder  {      public object BindModel(ControllerContext controllerContext, ModelBindinGContext bindingContext)      {          return controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName];      }  }

再将其运用到List的keywords参数上去:

public ActionResult List(      [ModelBinder(typeof(FromQueryBinder))]string keywords)

由于参数名是keywords,因此bindingContext.ModelName也是keywords,于是从Query String中便可以取到我们需要的内容了。至于在进行URL生成的时候,我们还是可以之间一样添加一个keywords字段到Route Value中去,于是在我们先前配置的Route规则中便会组装成合适的Path了(即/products/xxx)。

在这个例子中,我们让keywords匹配Path后端全部内容,但是如果是Path中间某一段需要有特殊字符怎么办呢?其实也一样,只是在进行URL Rewrite的时候,需要在最终重写的时候填写一个“假”的值就可以了,如这样的Route规则:

routes.MapRoute(      "Product.List",      "products/{keywords}/page",      new { controller = "Product", action = "List" });

而IIS级别的URL Rewrite重写的规则就可以是:

RewriteRule  ^/products/([^/]*)/(.*)     /products/useless-segement/$2?keywords=$1     [I,L,U]这样,如果用户输入/products/xxx/2就会被重写成/products/useless-token/2?keywords=xxx——事实上,在***个示例中我们也可以这么做,只是我“不习惯”增加一个伪造的值而已。

以上解决方案可以在IIS 6与IIS 7的Classic Mode中正常使用,只可惜在IIS 7的Intergrated Mode中,可能是由于ASP.NET接管了IIS的部分逻辑,因此会很早抛出“IIS级别”,而不是“ASP.NET级别”的Bad Request异常。如果您遇到了这种方式,就必须通过以下三个步骤来摆脱这个麻烦的问题了:

设置AllowRestrictedChars:KB820129(让IIS 7接受特殊字符)

设置VerificationCompatibility:KB826437中除了“安装.NET 1.1 SP1”以外的步骤(让ASP.NET接受特殊字符)

将ASP.NET页面的ValidateRequest设为False

其实您只要经过了这三步修改,对于目前这个案例,即使不用IIS级别的URL Rewrite应该也没有问题了。

上述就是小编为大家分享的和浅析ASP.NET MVC中关于URL Rewrite的实现了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 和浅析ASP.NET MVC中关于URL Rewrite的实现

本文链接: https://lsjlt.com/news/293283.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 和浅析ASP.NET MVC中关于URL Rewrite的实现
    这期内容当中小编将会给大家带来有关和浅析ASP.NET MVC中关于URL Rewrite的实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现在我们就来看一个真实案例:在ASP.NET MVC中使用II...
    99+
    2023-06-17
  • 深入浅析Spring MVC中的URL映射规则
    今天就跟大家聊聊有关深入浅析Spring MVC中的URL映射规则,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。url-pattern <servlet> <se...
    99+
    2023-05-31
    springmvc url 映射规则
  • asp.net core MVC之实现基于token的认证
    安装Nuget包 项目中添加包:dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer 添加认证配置 S...
    99+
    2024-04-02
  • 浅谈关于Android路由的实现
    先说一下背景,目前有需求从外部包括其他应用和WEB跳转到我们自己的APP,就这么个简单的需求……要实现这种外部跳转的功能,我们可以理解为打算跳转的一方有多少方式通知到APP进行相对的响应行为。所以,如果是应用之间的跳转,则有多种,你可以直接...
    99+
    2023-05-30
    android 路由 roi
  • 浅析java中 Spring MVC 拦截器作用及其实现
    拦截器的实现编写拦截器类实现HandlerInterceptor接口;将拦截器注册进springmvc框架中;配置拦截器的拦截规则;其他实现方法WebRequestInterceptor接口:与上一个的区别是参数区别和prehandle的方...
    99+
    2023-05-31
    java springmvc 拦截器
  • ASP.Net Core MVC中服务注册和管道的示例分析
    这篇文章给大家分享的是有关ASP.Net Core MVC中服务注册和管道的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IW...
    99+
    2023-06-29
  • 如何在Asp.Net Core MVC中处理null值的实现
    译文链接:https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-...
    99+
    2022-06-07
    ASP.NET core null MVC ASP net
  • ASP.NET MVC 2中如何实现右键菜单和简单分页
    本篇文章为大家展示了ASP.NET MVC 2中如何实现右键菜单和简单分页,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。右键菜单非常方便,很多时候会用到。这篇文章将使用一个JQUERY的插件在ASP...
    99+
    2023-06-17
  • ASP.NET Core MVC 中实现中英文切换的示例代码
      哈喽..大家好 很久没有更新了,今天就来一篇最近开发用到的功能,那就是中英文切换,这个实际上也不是高大上,先说一下原理,在.NET Core框架中给我们提供了全球化的类,叫...
    99+
    2022-06-07
    net 示例 ASP.NET MVC core ASP
  • java中关于==和equals的分析
    ==的分析对于基本数据类型,比较的是他们的具体内容是不是一样,跟他们的内存地址无关。举个例子:public class Test{ public static void main(String[] args) { int i = ...
    99+
    2019-12-15
    java == equals 分析
  • phpcms关于url路由在二次开发中的使用方法介绍-实现泛解析
    首先,路由是负责将用户请求映射到特定的 MVC 控制器操作.v9默认的路由文件是 caches\configs\route.php ,默认路由如下: 复制代码代码如下: 'default'=>array('m...
    99+
    2022-06-12
    phpcms url路由
  • JavaScript中的浅拷贝和深拷贝原理与实现浅析
    目录前言什么是浅拷贝实现浅拷贝什么是深拷贝实现深拷贝前言 JavaScript 中的浅拷贝和深拷贝指的是在复制对象(包括对象、数组等)时,是否只复制对象的引用地址或者在复制时创建一个...
    99+
    2023-05-17
    JavaScript深拷贝与浅拷贝 JS深拷贝与浅拷贝
  • ASP.NET Core MVC 修改视图的默认路径及其实现原理解析
    本章将和大家分享如何在ASP.NET Core MVC中修改视图的默认路径,以及它的实现原理。 导语:在日常工作过程中你可能会遇到这样的一种需求,就是在访问同一个页面时PC端和移动端...
    99+
    2024-04-02
  • MVC中怎么基于Ajax和HTML5实现文件上传功能
    这篇文章主要讲解了“MVC中怎么基于Ajax和HTML5实现文件上传功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MVC中怎么基于Ajax和HTML5实...
    99+
    2024-04-02
  • 浅析Golang中map的实现原理
    Golang是一门支持面向对象编程的编程语言,它拥有高效的内存管理机制和灵活的语法特性,被广泛用于服务器端开发、网络编程、云计算等领域。在Golang中,map是一种非常重要的数据结构,它可以存储键值对,并提供快速的查找和插入操作。本文将介...
    99+
    2023-05-14
    go语言 Golang map
  • 浅析Vue中Virtual DOM和Diff原理及实现
    目录0. 写在开头1. vdom2. Diff0. 写在开头 本文将秉承Talk is cheap, show me the code原则,做到文字最精简,一切交由代码说明! 1. ...
    99+
    2023-03-21
    Vue Virtual DOM Diff原理 Vue Virtual DOM Vue Diff
  • Flutter中关于angle的坑实例分析
    这篇“Flutter中关于angle的坑实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter中关于angle...
    99+
    2023-07-02
  • java中关于队列的数组和链表实现
    队列的介绍队列是一种先进先出(FIFO)的线性的数据结构,队列的主要操作为入队和出队。队头:队列的出口端,队尾:队列的入口端,通常在数组中表示为最后入队元素的下一个位置。在用数组实现时,注意:若队头不断有元素出队,那么队列的可用空间就会变小...
    99+
    2022-04-06
    java教程 java 队列 数组 链表 实现
  • C++中关于多态实现和使用方法
    目录赋值兼容实例多态静多态动多态格式实例override纯虚函数含有虚函数的析构函数注意事项RTTItypeidtypecast多态实现虚函数一般继承(no override)一般继...
    99+
    2024-04-02
  • PHP中实现高效的URL路由解析方案
    在开发Web应用程序时,URL路由解析是一个非常重要的环节。它可以帮助我们实现友好的URL结构,并将请求映射到相应的处理程序或控制器中。本文将介绍一种高效的URL路由解析方案,并提供具体的代码示例。一、URL路由解析的基本原理URL路由解析...
    99+
    2023-10-21
    URL路由 路由解析 高效实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作