IIS 6的Server.TransferRequest

时间:2012-02-01 08:48:56

标签: asp.net iis-7 error-handling iis-6 http-status-code-404

有没有办法在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上)

3 个答案:

答案 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;任何地方 - 只需显示您的页面。