在mvc中,Url地址是利用routing特性来支持,但是这个Routing有个问题,多个不同的地址和指向同一个action方法,

例如:

        http://test.com (默认)
http://test.com/ (斜杠结尾)
http://test.com/Home (带有Controller)
http://test.com/Home/Action (带有Controller和Action)
http://test.com/home/Action (不同的情况)

解决方法:通过使用注册全局的filter

先定义一个filter

 public class RemoveDuplicateContentAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var routes = RouteTable.Routes;
var requestContext = filterContext.RequestContext;
var routeData = requestContext.RouteData;
var dataTokens = routeData.DataTokens;
if (dataTokens["area"] == null)
dataTokens.Add("area", "");
var vpd = routes.GetVirtualPathForArea(requestContext, routeData.Values);
if (vpd != null)
{
var virtualPath = vpd.VirtualPath.ToLower();
var request = requestContext.HttpContext.Request;
if (virtualPath != request.Path)
{
filterContext.Result = new RedirectResult(virtualPath + request.Url.Query, true);
}
}
base.OnActionExecuting(filterContext);
}
}

然后注册这个filter:

   public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//整个程序所有控制器都使用HandlerError来处理错误
//不过它只处理500系列错误,404类型需要单独处理
filters.Add(new HandleErrorAttribute());
filters.Add(new RemoveDuplicateContentAttribute());
}

总结:
首先获取当前的RequestContext和RouteData,然后判断如果当前没有使用Area的话就为DataToken添加一个空值,这个非常重要,否则,后面再使用Area特性的话就会出错

接着该filter通过RouteData获取虚拟path,然后toLower转成小写
然后和当前request的path进行比较,如果不一致就重定向到小写的虚拟path上,这样搜索引擎就能识别当多个请求其实都是对应虚拟的path的真实地址上,也就是唯一的action地址,
对于SEO:确保一个地址对应一个内容是非常重要的,

mvc Routing特性优化的更多相关文章

  1. Asp.net MVC]Asp.net MVC5系列——Routing特性

    目录 概述 路由特性 使用路由 可选参数和参数的默认值 路由前缀 默认路由 路由约束 自定义路由约束 路由名 区域(Area) 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列— ...

  2. ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header

    继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The ...

  3. ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

    网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 ...

  4. ASP.NET MVC 3 网站优化总结(六)压缩 HTML

    压缩 html 可以去除代码中无用的空格等,这样可提高网站的加载速度并节省带宽.今天就让我们看看在 ASP.NET MVC 3 怎么实现 html 压缩,我们可通过实现 ActionFilter 来完 ...

  5. MVC常用特性

    MVC常用特性使用   简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将 ...

  6. ASP.NET MVC最新特性

    问题: 既然我说对ASP.NET MVC很熟很懂,对新技术很感兴趣,那么问题是: 当前最新版MVC是什么?你用的哪个版本?相比前一个版本有什么新的特性? 解析: 在面试的时候,为了争取面试官的好感,显 ...

  7. ASP.NET MVC Routing学习笔记(一)

    Routing在ASP.NET MVC中是非常核心的技术,属于ASP.NET MVC几大核心技术之一,在使用Routing之前,得先引入System.Web.Routing,但其实不用这么麻烦,因为在 ...

  8. ASP.NET(支持 ASP.NET MVC)性能优化包 - combres 介绍

    项目地址:https://github.com/buunguyen/combres Overview Combres (previously hosted in CodePlex) helps you ...

  9. 关于MVC的特性(AuthorizeAttribute)的一些理解

    许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限. 在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段. 要限制对 ASP.NET MVC 视图的访问 ...

随机推荐

  1. udhcpc和udhcpd移植

    实现DHCP自动获取IP地址 前提:系统已经实现DNS(即使用ping www.baidu.com测试时能ping通). 1.  在内核中添加以下选项: Networking  ---> [*] ...

  2. (转)使用pth文件,让python方便的import自己写的模块

    转自:http://www.elias.cn/Python/PythonPath 文章简单易懂,有理有据. 有时候我们正在修改或调试的程序会是一个库,为修改方便,我们可能不大希望把它放到 site-p ...

  3. 成功安装mysql(mysql-5.5.32-winx64.msi)后,为何服务管理器里找不到MYSQL服务名?

    解决方案: 1.打开cmd,切换到mysql的bin目录下 2. D:\Program Files\MySQL5.1\bin>mysqld.exe -install 成功后会出现:Service ...

  4. 单调栈 二 nyOj 最大矩形和

    主要思想来自 http://blog.csdn.net/wuyanyi/article/details/7243580 题目的连接,头次提交的同学需要注册 http://acm.nyist.net/J ...

  5. HDU-1814 Peaceful Commission 2sat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 简单的2sat题. //STATUS:C++_AC_390MS_996KB #include & ...

  6. Codeforces294B - Shaass and Bookshelf(贪心)

    题目大意 给你N本书,每本书由一个厚度t[i](1或者2),宽度w[i],高度都是一样,把一些书竖着放,然后一些书横着放在同一层,就像下图那样放: 问你把所有的书放好之后竖着的书的总厚度是多少? 题解 ...

  7. poj1637--Sightseeing tour(最大流)

    最大流求混合图是否存在欧拉回路. 以下内容摘自http://www.cnblogs.com/Missa/archive/2012/12/05/2803107.html 讲的很清楚. 混合图的欧拉回路问 ...

  8. jQuery进行图片预先加载

    /** **将图片加载到内存中,在页面任何位置引用的时候,直接从缓存中读取,提升用户的体验,提高网站的流畅度.** **/ <!DOCTYPE html PUBLIC "-//W3C/ ...

  9. Java 随机生成中文姓名,手机号,邮编,住址

    package lovo; import java.util.HashMap; import java.util.Map; /** * 随机生成中文姓名,性别,Email,手机号,住址 * @auth ...

  10. Java 中 String 类和StringBuilder 类的常用方法

    String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之处吧. String 类的常用方法: 结合代码 ...