這裡是孟子提供的方法
這裡介紹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> ");