web项目自定义路由_实现静态资源URL控制
前言: IIS会默认把:图片、JS、HTML、CSS这些文件当成静态资源处理,为了减少服务器压力,默认这些静态资源是不走URL路由规则控制的。
作为小白及初学者,本人对这些了解甚少,补充基础知识吧: 由于业务需求,新建了一个空的WEB项目,但是需要把原项目中的一些功能Copy过来,如:自定义路由这块,在接着这块的时候,遇到了很多问题,后来逐一解决,下面给大家分享下遇到的问题及学到的解决方案,供以后继续学习使用。
第1个问题:空项目如何建立自定义路由?
1-a:为空项目在根目录下创建全局应用程序类,global.asax.cs文件,global文件的作用是帮助项目处理全局的一些问题,如:项目启动时,项目发生错误时等等,我们用到的路由,就需要在global的监控项目启动事件里注册路由。
需要知道的是:global里的事件是在项目的任一文件加载时会自动执行。具体可以参阅,什么是global文件? https://www.cnblogs.com/saywa3b/p/5809434.html
protected void Application_Start(object sender, EventArgs e)
{
UrlRoutingBus.RegisterRoutes();
}
public class UrlRoutingBus
{
public static void RegisterRoutes()
{
#region Ignore
//注册路由忽略的文件类型
RouteTable.Routes.Ignore("{filename}.png/{*pathInfo}");
RouteTable.Routes.Ignore("{filename}.jpg/{*pathInfo}");
RouteTable.Routes.Ignore("{filename}.css/{*pathInfo}");
RouteTable.Routes.Ignore("{filename}.js/{*pathInfo}");
RouteTable.Routes.Ignore("{filename}.ashx/{*pathInfo}");
#endregion const string CULTURE = "culture";
string culture = "en|cn";
RouteValueDictionary constraints = null;
foreach (UrlRoutingSetting urlRoutingSetting in UrlRoutingSettingConfig.UrlRoutingSettingCollection)
{
constraints = new RouteValueDictionary();
foreach (KeyValuePair<string, object> pair in urlRoutingSetting.Constraints)
{
if (pair.Key.Equals(CULTURE, StringComparison.CurrentCultureIgnoreCase))
{
constraints.Add(CULTURE, string.IsNullOrEmpty(culture) ? pair.Value : culture);
}
else
{
constraints.Add(pair.Key, pair.Value);
}
}
if (!string.IsNullOrEmpty(urlRoutingSetting.DomainName))
{
RouteTable.Routes.Add(new DomainRoute(urlRoutingSetting.DomainName, urlRoutingSetting.RouteUrl, urlRoutingSetting.PhysicalFile, urlRoutingSetting.CheckPhysicalUrlAccess, urlRoutingSetting.Defaults, constraints));
}
else if (!string.IsNullOrEmpty(urlRoutingSetting.RouteName))
{
if (urlRoutingSetting.RouteName.Equals("ajax", StringComparison.CurrentCultureIgnoreCase))
{
RouteTable.Routes.Add(new Route(urlRoutingSetting.RouteUrl, urlRoutingSetting.Defaults, constraints, new HttpHandlerRoute(urlRoutingSetting.PhysicalFile)));
}
else
{
RouteTable.Routes.MapPageRoute(urlRoutingSetting.RouteName, urlRoutingSetting.RouteUrl, urlRoutingSetting.PhysicalFile, urlRoutingSetting.CheckPhysicalUrlAccess, urlRoutingSetting.Defaults, constraints);
}
}
}
}
}
路由配置(给静态文件Url请求设置路由,这个设置是想实现让所有的ajax下的js请求都去找一般处理程序;让所有的Html请求都去找web页面):
<configSections>
<section name="urlRoutingSettings" type="UrlRouting.Config.UrlRoutingSettingConfigSection, TLZ.UrlRouting" />
</configSections> <urlRoutingSettings>
<settings>
<clear />
<add routeName="ajax" routeUrl="ajax/{0}.js" physicalFile="~/ajax/{0}.ashx" checkPhysicalUrlAccess="true" />
<add routeName="html_" routeUrl="{0}.html" physicalFile="~/{0}.aspx" />
</settings>
</urlRoutingSettings>
第2个问题:在完成了自定义路由后,并在项目启动时添加了注册方法,我们开始做测试:
发现我们设置的路由并没有起作用???后来查阅很多资料,并请教老大后才知道,这些都属于静态资源。.net默认是不走Url路由规则的,即使我们定义了注册了路由!!
后来老大给了一个方法:webconfig可以设置强制让所有的HTTP请求默认走路由规则:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>
重新验证效果,可以请求到页面:Index.aspx页面了,成功了,很高兴:
到这里我们已经实现了:使用自定义路由控制静态资源的请求控制。。。 当然我好遇到了一些其他的知识点给大家分享下:
第3个问题:如何设置项目默认启动页?为什么项目会默认显示Index.html页面的内容?
其实这个启动页是在IIS里可以看到的,默认的启动页是:
其中index.aspx是我们新加的启动页,配置文件会自动生成配置:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
<defaultDocument>
<files>
<add value="index.aspx" />
</files>
</defaultDocument>
</system.webServer>
第4个问题:经过翻阅资料了解到,.net之所以默认静态资源不走规则控制,是为了节约服务器资源,减少中间处理和请求,提升网页加载效率的考虑。 那么自己的项目本身页面是aspx,经过自定义路由改造成.html的URL形式,主要为了什么?
项目中原本就是静态文件的资源,如果多了这一层处理,是不是违背了.net对静态资源处理的初衷??
第一个小问题的解释:
这个:需要了解一个概念:“伪静态”,我们把原本非静态资源伪装成静态资源的形式,这有一些列的好处,最直接的就是:有利于浏览器的URL地址收录;帮助我们隐藏项目结构,有利于安全; 对请求参数的在URL中传输方式的改造等等吧。 说的不太准确,这里放一个参考地址: https://baike.baidu.com/item/%E4%BC%AA%E9%9D%99%E6%80%81
第二个小问题的解释:
我们已经在注册路由的时候,加了过滤的请求。。第二个如果是请求的静态资源走的是:http请求,不在当前项目域内的静态资源,并不受本项目路由约束,如:
<script type="text/javascript" src="js/test.js"></script>
<script type="text/javascript" src="http://www.abc.com/js/test.js"></script>
第一个走的是项目内的规则,第二个JS则不受本项目约束。
大家就这么多吧,没有仔细验证,可能有不对的地方,供参考学习使用,以后会继续完善补充...
web项目自定义路由_实现静态资源URL控制的更多相关文章
- go web编程——自定义路由设计
本文主要讲解go语言web编程中自定义路由器的设计.在此之前需要先了解一下go语言web编程中路由与http服务的基本原理,可以参考笔者另一篇博文:go web编程——路由与http服务 . 我们已经 ...
- 已有项目使用Asset Pipeline管理静态资源
1. 修改项目中指向静态资源文件的链接 a) 访问静态资源文件 <%= stylesheet_link_tag "application", media: " ...
- Springboot2.1.1下的自定义拦截器而静态资源不能访问的问题
1.项目结构 2.自定义拦截器 public class LoginHandlerlnterceptor implements HandlerInterceptor { //目标方法执行之前 @Ove ...
- Spring Mvc Web 配置拦截规则与访问静态资源 (三)
拦截规则配置 1. *.do <!-- Processes application requests --> <servlet> <servlet-name>app ...
- spring项目加载不出来静态资源
方法1: 拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <!-- 添加注解驱动 --> <mvc:annotation-driven/> <!- ...
- spring mvc 自定义handler不拦截静态资源
处理静态资源的handler和处理Controller请求中的handler不同,对应的Interceptor也不同 查找对应handler是在DispatcherServlet中 因此一些自定义的I ...
- [Python之路] 使用装饰器给Web框架添加路由功能(静态、动态、伪静态URL)
一.观察以下代码 以下来自 Python实现简易HTTP服务器与MINI WEB框架(利用WSGI实现服务器与框架解耦) 中的mini_frame最后版本的代码: import time def in ...
- springboot 项目中css js 等静态资源无法访问的问题
目录 问题场景 问题分析 问题解决 问题场景 今天在开发一个springboot 项目的时候突然发现 css js 等静态资源竟然都报404找不到,折腾了好久终于把问题都解决了,决定写篇博客,纪录总结 ...
- 关于如何在你的Web项目中实现对空间数据访问权限的控制(一)
Wednesday, 23 JUNE 近来一直在研究关于如何在我的WebGIS项目中实现对空间数据(已发布在GeoServer上)进行权限管理的问题.虽然到目前为止没能找到一个完美的解决方案,但通过这 ...
随机推荐
- java基础- Collection和map
使用构造方法时,需要保留一个无参的构造方法 静态方法可以直接通过类名来访问,而不用创建对象. -- Java代码的执行顺序: 静态变量初始化→静态代码块→初始化静态方法→初始化实例变量→代码块→构造方 ...
- css的input文本框的 propertychange、focus、blur
1.输入框检查的需求--即时搜索--解决方案 当input的value发生变化就会发生,无论是键盘输入还是鼠标黏贴的改变都能及时监听到变化,propertychange,只要当前对象属性发生改变.(I ...
- PyCharm下载及安装教程
pycharm官网地址 https://www.jetbrains.com/pycharm/download/#section=windows 下载社区版 选择安装路径E:\Python\pychar ...
- 沉默的螺旋--digest
孤立的恐惧对名望的追求高度的和谐和共识是大部分人的幸福感.安全感的源头公开性能让某种行为具有社会可接受性 P5谈论和沉默决定了意见气候那些被新的东方政策说服的人,感觉自己所想的都是合理的.因此他们就会 ...
- 利用 ssh 的用户配置文件 config 管理 ssh 会话
http://dhq.me/use-ssh-config-manage-ssh-session 利用 ssh 连接远程服务器,一般都要输入以下类似命令: 1 ssh user@hostname -p ...
- 我的Python之旅第三天
一 编码操作 1 编码 enconde() 英文字符编码为"utf-8"时,一个字符占一个字节. s1='abcdef' b1=s1.encode('utf-8') print(b ...
- pymongo 学习总结
1.简介 MongoDB是一种强大.灵活.追求性能.易扩展的数据存储方式.是面向文档的数据库,不是关系型数据库,是NoSQL(not only SQL)的一种.所谓的面向文档,就是将原来关系型数据库中 ...
- GO语言.树莓派.环境安装和测试
Go是Google开发的一种静态强类型.编译型.并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识别,有时会将其称为Golang 记录一下如何在树莓派上安装语言环境 第一步: 下载安装包 http ...
- 「SDOI2018」物理实验
题目大意: 这题不好描述,直接看原题吧…… 题解: 很无脑的题……就是卡精度+难写.代码能力还是太差了. 其实可以直接用long double肝过去.但我的代码似乎太丑了,以至于跑得奇慢无比. 代码: ...
- [codeforces 804F. Fake bullions]
题目大意: 传送门. 给一个n个点的有向完全图(即任意两点有且仅有一条有向边). 每一个点上有$S_i$个人,开始时其中有些人有真金块,有些人没有金块.当时刻$i$时,若$u$到$v$有边,若$u$中 ...