有没有办法在IIS 6中伪造TransferRequest的行为?特别是在没有客户端提出新请求的情况下重新处理整个管道的能力?
我正在尝试处理来自Application_Error的404错误,做一些魔法来查看URL是否更改(在这种情况下我使用Response.Redirect重定向到新URL)但是如果真的有404我想要提供我看起来漂亮的404页面,该页面必须处理显示用户会话中的一些内容。
问题是,如果我使用Server.Transfer,请求上下文此时为空,因此我的404页面崩溃。我不想使用Request.Redirect,因为我希望浏览器URL仍然在缺少的URL上,以便为缺失的资源正确解释404状态代码。
在IIS 7上,我可以使用TransferRequest,它完全符合我的要求。浏览器保留缺少的URL,并且404页面代码可以使用Session上下文。那么有没有办法与IIS 6做类似的事情? (TransferRequest仅在管道模式下的IIS 7中可用,而我们的生产服务器仍在IIS 6上)
答案 0 :(得分:2)
一种可能的解决方案是使用标志进行重定向,然后在BeginRequest上创建RewritePath。
例如,您将此代码放在Global.asax
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Request.RawUrl.EndsWith("error"))
{
HttpContext.Current.RewritePath("404CoolPage.aspx", false);
}
// .... rest code
}
然后在
上进行重定向void Application_Error(object sender, EventArgs e)
{
//... code
if(System.Web.HttpContext.Current.Request.QueryString.Count > 0)
Response.Redirect(HttpContext.Current.Request.RawUrl + "&error");
else
Response.Redirect(HttpContext.Current.Request.RawUrl + "?error");
}
这样,您可以进行重定向,并保持网址不变。
顺便说一句,我使用的是Server.Transfer,它对我有用。这是我的错误设置,转移是使用服务器完成的,我不确定您的页面在哪里遇到请求上下文的问题
void Application_Error(object sender, EventArgs e)
{
// ... log the errors ...
string cTheFile = HttpContext.Current.Request.Path;
// in case the error is inside the 404CoolError.aspx
// I check for not calling my self and get a dead loop.
if(!cTheFile.EndsWith("404CoolError.aspx"))
Server.Transfer("~/404CoolError.aspx");
}
和web.config
<customErrors redirectMode="ResponseRewrite" ... />
答案 1 :(得分:1)
从我收集的内容来看,没有标准方法可以在IIS 6上模拟TransferRequest
- 至少在大部分代码没有重写的情况下都是如此。
唯一可用的其他选项(除Transfer
之外,您指出它不能满足您的要求)是:
我怀疑,通过一些摆弄你可以使用Execute
创建一个尽可能接近IIS6的解决方案,尽管我不确定性能是否良好。
关于RewritePath
,您可以从这样的事情开始,并将其扩展到您想做的事情:
HttpContext.Current.RewritePath(url, false);
IHttpHandler httpHandler = new YourHTTPHandler(); // use your HttpHandler !
httpHandler.ProcessRequest(HttpContext.Current);
答案 2 :(得分:0)
您可以在IIS中设置自定义错误处理程序。在网站属性页面的自定义错误标签上,修改&#39; 404&#39;并将其设置为&#39; 404.aspx&#39; (管他呢)。移动你的魔法&#39;代码到404页面。如果你找到真正的404,那么就没有必要转移&#39;任何地方 - 只需显示您的页面。