Server.TransferRequest для IIS 6 - PullRequest
       40

Server.TransferRequest для IIS 6

2 голосов
/ 01 февраля 2012

Есть ли способ подделать поведение TransferRequest в IIS 6? В частности, возможность повторной обработки всего конвейера без необходимости делать новый запрос клиенту?

Я пытаюсь обработать ошибку 404 из Application_Error, сделайте некоторую магию, чтобы увидеть, изменился ли URL (в этом случае я использую Response.Redirect для перенаправления на новый URL), но если действительно существует 404, я хочу покажи мою симпатичную страницу 404, которая имеет дело с показом некоторого контента, который является частью сеанса пользователя.

Проблема в том, что если я использую Server.Transfer, контекст запроса на этом этапе будет нулевым, поэтому моя страница 404 падает. Я не хочу использовать Request.Redirect, потому что я хочу, чтобы URL-адрес браузера оставался на отсутствующем URL-адресе, чтобы код состояния 404 правильно интерпретировался для отсутствующего ресурса.

На IIS 7 я могу использовать TransferRequest, который делает именно то, что я хочу. Браузер сохраняет отсутствующий URL, а контекст сеанса доступен для кода страницы 404. Так есть ли способ сделать что-то подобное с IIS 6? (TransferRequest доступен только в IIS 7 в режиме конвейера, а наши производственные серверы все еще работают на IIS 6)

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Одним из возможных решений является перенаправление с флагом, а затем создание RewritePath для BeginRequest.

Например, вы помещаете этот код в 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");   
}

Таким образом, вы делаете перенаправление и сохраняете URL как есть.

My Error Setup

Кстати,Я использую 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 голос
/ 05 февраля 2012

Из того, что я понял, нет стандартного способа имитации TransferRequest на IIS 6 - по крайней мере, без значительной переписки большей части вашего кода.

единственными доступными опциями (кроме Transfer, который вы указали, что он не делает то, что вам нужно) являются:

Я подозреваю, что с некоторыми сложностями вы могли бы создать решение, максимально приближенное к IIS6, используя Execute, хотя я не уверен, что производительность будет хорошей.

Относительно RewritePath вы могли бы начать с чего-то подобного и расширить его, чтобы делать то, что вы хотите:

HttpContext.Current.RewritePath(url, false);
IHttpHandler httpHandler = new YourHTTPHandler(); // use your HttpHandler !
httpHandler.ProcessRequest(HttpContext.Current);
0 голосов
/ 05 февраля 2012

Вы можете настроить собственный обработчик ошибок в IIS.На странице свойств веб-сайта на вкладке пользовательских ошибок отредактируйте «404» и установите для него значение «404.aspx» (или что-либо еще).Переместите свой «волшебный» код на страницу 404.Если вы найдете настоящий 404, то вам не нужно «переводить» куда-либо - просто позвольте вашей странице отображаться.

...