ASP.NET 页面双向静态化

简介:   而我们预期的结果应该如下图,实际只请求两次。 用301重定向可以解决该循环请求产生的问题。 OK, let’s begin. 本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有提及创建的,表示已经在上一篇文章中创建过。

 

image

而我们预期的结果应该如下图,实际只请求两次。

image

用301重定向可以解决该循环请求产生的问题。

OK, let’s begin.

本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有提及创建的,表示已经在上一篇文章中创建过。
本文已经同步至我的个人博客站点:积累吧|ASP.NET 页面双向静态化

源代码下载:Routing-Static-Page-Demo-V2

Demo(点击这些链接会自动跳转到对应的.html页):

  • http://csdemo.jileiba.com
  • http://csdemo.jileiba.com/Default.aspx
  • http://csdemo.jileiba.com/Account/Login.aspx

1. 修改CustomRouteHandler类,添加RequestPath属性

using System.Web; using System.Web.Compilation; using System.Web.Routing; using System.Web.UI; namespace Routing_Static_Page_Demo.WebHandler{    public class CustomRouteHandler : IRouteHandler    {        /// <summary>        /// 虚拟路径        /// </summary>        public string VirtualPath { get; private set; }        /// <summary>        /// 请求路径        /// </summary>        public string RequestPath        {            get { return VirtualPath.Substring(1); }        }                public CustomRouteHandler( string virtualPath)        {            this.VirtualPath = virtualPath;        }        /// <summary>        /// 返回实际请求页        /// </summary>        public IHttpHandler GetHttpHandler( RequestContext requestContext)        {            foreach ( var urlParm in requestContext.RouteData.Values)            {                requestContext.HttpContext.Items[urlParm.Key] = urlParm.Value;            }            var page = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof( Page)) as IHttpHandler;            return page;        }    }}

RequestPath属性是从VirtualPath过来的,如果VirtualPath为~/default.aspx,那么对应的RequestPath则是/default.aspx

2. 在WebModule下创建CustomHttpModule.cs类

using System; using System.Globalization; using System.Web; using System.Web.Routing; using Routing_Static_Page_Demo.WebHandler; namespace Routing_Static_Page_Demo.WebModule{    public class CustomHttpModule : IHttpModule    {        private HttpApplication app;        public void Init( HttpApplication context)        {            app = context;            app.AuthorizeRequest += App_AuthorizeRequest;        }        public void App_AuthorizeRequest( object sender, EventArgs e)        {            HttpRequest req = app.Request;            string path = req.Path;            // 如果是.aspx页面            if (path.EndsWith( ".aspx", true, CultureInfo.CurrentCulture))            {                // routeUrl则用于存放对应的.html                string routeUrl = string.Empty;                // 遍历RouteTable,找到.aspx页面对应的.html                foreach ( Route route in RouteTable.Routes)                {                    // 获取CustomRouteHandler                    var handler = ( CustomRouteHandler) route.RouteHandler;                    // 获取CustomRouteHandler的RequestPath                    string requestPath = handler.RequestPath;                    if (requestPath.ToLower() == path.ToLower())                    {                        routeUrl = route.Url;                        break;                    }                }                // 将.aspx页面永久重定向到对应的.html页面                app.Response.StatusCode = 301;                app.Response.AddHeader( "Location", "/" + routeUrl);                app.Response.End();            }        }        public void Dispose()        {        }    }}

如果你不太熟悉HttpApplication的事件,可以参照:MSDN HttpApplication事件
如果你不太熟悉HttpApplication的用法,可以参照:MSDN HttpApplication类

3. 修改web.config文件,添加HttpModule配置

黄色标记的地方是添加的,其它配置不变。

<? xml version =" 1.0" encoding =" UTF-8" ?>< configuration >  < system.web >    < compilation debug =" true" targetFramework =" 4.0" />    < httpModules >      < add name =" CustomHttpModule" type =" Routing_Static_Page_Demo.WebModule.CustomHttpModule, Routing_Static_Page_Demo" />    </ httpModules >  </ system.web >  < system.webServer >    < modules runAllManagedModulesForAllRequests =" true" >      < remove name =" UrlRoutingModule" />      < add name =" UrlRoutingModule" type =" System.Web.Routing.UrlRoutingModule,                                           System.Web,                                           Version=4.0.0.0,                                           Culture=neutral,                                           PublicKeyToken=b03f5f7f11d50a3a" />      < add name =" CustomHttpModule" type =" Routing_Static_Page_Demo.WebModule.CustomHttpModule" />    </ modules >    < handlers >      < add name =" UrlRoutingHandler"                                   preCondition =" integratedMode"                                   verb =" *" path =" UrlRouting.axd"                                  type =" System.Web.HttpForbiddenHandler, System.Web,                                        Version=2.0.0.0, Culture=neutral,                                        PublicKeyToken=b03f5f7f11d50a3a" />                      </ handlers >  </ system.webServer ></ configuration >

在VS自带的WebDev服务器中运行这个项目:在浏览器栏输入http://localhost:xxxx/Default.aspx,会自动跳转到http://localhost:xxxx/Index.html,运行默认路径http://loclhost:xxxx/也会自动跳转到http://localhost:xxxx/Index.html。

4. 在IIS中运行项目

WebDev运行虽然通过了,IIS可不见得通过,毕竟WebDev的权限太高了。

果然,运行之后,出现下面的错误画面:

SNAGHTML9af826

还是web.config的配置问题。在<webserver>节点下添加下面一行配置:

< validation validateIntegratedModeConfiguration =" false" />

这一行配置并不会真正影响web应用程序的安全性,它只是用于关闭有些配置将不会被使用的警告。

That’s end, have fun.nking, keep moving, even if the road obstacles , the one more important thing is that always be a pig for you, that's keep fool.

 

目录
相关文章
|
2月前
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
40 5
|
JavaScript 前端开发
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
2473 0
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
|
5月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
|
2月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
|
JavaScript
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
|
开发框架 数据可视化 前端开发
ASP.NET Core MVC+Quartz实现定时任务可视化管理页面
ASP.NET Core MVC+Quartz实现定时任务可视化管理页面
531 0
|
开发框架 JavaScript .NET
Asp.net C#页面传参的几种方式
Asp.net C#页面传参的几种方式
136 0
mvc.net分页查询案例——前台页面(Index.aspx)
mvc.net分页查询案例——前台页面(Index.aspx)
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
234 0