这里介绍Ihttpmodule处理请求管道的方法。Response.Redirect的原理是服务器设置返回http状态码为302,然后客户端执行跳转,用reflector可以看到.net的代码段。 以下是HttpResponse类的Redirect方法中的跳转代码 this.StatusCode = 0x12e; this.RedirectLocation = url;
所以,我们可以扩展Ihttpmodule来拦截http状态码,强制设为200,同时插入js代码段来实现新窗口打开。以下是Ihttpmodule的实现代码 using System; using System.Collections.Generic; using System.Text; using System.Web; namespace ClassLibrary2 ...{ public class Class1:System.Web.IHttpModule ...{ public void Init(HttpApplication application) ...{ application.PreSendRequestHeaders += new EventHandler(application_PreSendRequestHeaders); } void application_PreSendRequestHeaders(object sender, EventArgs e) ...{ HttpApplication Application = (HttpApplication)sender; HttpContext context = Application.Context; if (context.Response.StatusCode == 302) ...{ context.Response.Write("<script>window.open('"+context.Response.RedirectLocation+"')</script>"); context.Response.StatusCode = 200; } } public void Dispose() ...{ } } }
最后配置一下web.config就可以了 <?XML version="1.0"?> <configuration> <system.web> <compilation debug="true"/> <authentication mode="Windows"/> <httpModules> <add name="MyModule" type="ClassLibrary2.Class1,ClassLibrary2"></add> </httpModules> </system.web> </configuration>
另外一点,ms自坐主张的在跳转之后,end之前插入了这么一段代码,我得b4他们一下,解决办法,大家自己想想吧。 this.Write("<html><head><title>Object moved</title></head><body> "); this.Write("<h2>Object moved to <a href="" + HttpUtility.HtmlAttributeEncode(url) + "">here</a>.</h2> "); this.Write("</body></html> ");
(责任编辑:admin) |