Server.Transfer выдает ошибку при выполнении дочернего запроса. Как решить?

У меня есть HttpModule в C # 2.0, который обрабатывает выброшенные исключения. При возникновении исключения будет вызываться страница ошибки (aspx) с некоторой строкой запроса. Это делается через Server.Transfer().

Но когда элемент управления пытается выполнить Server.Transfer(), возникает следующее исключение:

Ошибка при выполнении дочернего запроса для [pagename] .aspx.

Тогда как Request.Redirect() работает нормально.

Я пробовал установить EnableViewStateMac="false" в директиве Page страницы, на которую передается запрос. Проблема все еще сохраняется.

Вот код, который я пробовал:

string errorPage = "errorpage.aspx?id=" + someErrorId
HttpContext.Current.Server.Transfer(errorPage,true);

Есть идеи, как это можно решить?


person Amit    schedule 02.03.2010    source источник


Ответы (8)


Нашел альтернативу Server.Transfer ()

я использовал

 HttpContext.Current.RewritePath("somefile.aspx");

Это решило проблему.

person Amit    schedule 02.03.2010
comment
Как вы это использовали? Исключение Ошибка выполнения дочернего запроса исчезло, но я получаю пустую страницу. - person Serge S.; 20.08.2010
comment
Вы должны сделать это в IHttpModule. См. msdn.microsoft.com/en-us/library/ms972974.aspx (к сожалению, статья слишком длинная, на самом деле концепция довольно проста). - person mhenry1384; 29.09.2011
comment
Если у вас есть Server.Transfer, вы, вероятно, можете просто вызвать Context.RewritePath, вместо того, чтобы вызывать HttpContext.Current для получения объекта HttpContext :) - person Owen Blacker; 10.06.2014

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

Использование HttpContext.Current.RewritePath не сработало, потому что казалось, что его игнорируют, и меня никуда не перенаправляли.

Если вы используете IIS 7 и выше, вы можете использовать вместо него Server.TransferRequest, который помог мне.

Различия между этими двумя методами описаны в этом ответе: TransferRequest vs Transfer в ASP.Net < / а>

person Karl    schedule 17.02.2015
comment
Работал у меня. Других ответов нет. - person Ash; 31.01.2019

Мое исправление было другим:

В результате онлайн-запроса была создана эта статья базы знаний Microsoft, в которой говорилось, что решением будет использование Response.Redirect вместо Server.Transfer.

Я изменил команду и получил более точное «Сообщение об ошибке 404» вместо загадочного «Ошибка выполнения дочернего запроса».

Это заставило меня проверить строку перенаправления, и я заметил, что мой путь сбился.

Я исправил строку передачи с «ErrorPage.aspx» на «../ErrorPage.aspx» (обратите внимание на изменение пути), и Server.Transfer работал нормально.

person ray    schedule 21.02.2014
comment
Я обнаружил, что мне нужно изменить это на ~ / ErrorPage.aspx, иначе он перестанет работать, когда я перейду из подкаталога в корень приложения (см. Мой ответ) - person Tevin; 27.09.2016
comment
Мы использовали Server.Execute и получили сообщение. Спасибо! Это также была ошибка 404. - person Justin Tolchin; 09.04.2018

Если вы видите, что это исключение возникает в VS.NET IDE во время отладки, продолжайте хотя бы один раз и нажмите F5, чтобы продолжить отладку. В моем случае реальная страница отображалась с исключением ASP.NET, которое действительно вызывало проблему. В моем случае у меня был неправильно отформатированный asp:ChangePassword элемент управления, который фактически вызывал исключение «Ошибка выполнения дочернего запроса».

person atconway    schedule 18.10.2012
comment
Я считаю, что это также указано в свойстве InnerException исключения. В моем случае это был отсутствующий пользовательский элемент управления. - person Nelson Rothermel; 14.01.2013

Я изменил Server.Transfer на Server.TransferRequest, и тогда у меня возникло настоящее исключение. Это была проблема со ссылкой на неправильную версию ReportViewer.

person Maximiliano Ancillotti    schedule 12.07.2019

Server.Transfer ("mywebpage.aspx") работает только тогда, когда сеанс уже существует.

Если сеанс не запущен, возникает эта ошибка, поэтому необходимо использовать Response.Redirect или другой метод.

person Ben    schedule 28.05.2014

У меня была такая же проблема, и я обнаружил, что это связано с относительными путями того, где работает Server.Transfer и куда вы перенаправляетесь. В моем случае это выполнялось в подкаталоге, поэтому ответ @ ray (добавление ../ в начало URL-адреса) работал. Однако, когда я затем выполнил в указанном выше каталоге, произошло то же самое. Поэтому я перешел на использование корневого пути:

Server.Transfer("~/errorpage.aspx")
person Tevin    schedule 27.09.2016

Это не ошибка, это сделано намеренно. См. http://support.microsoft.com/kb/320439

person Jamie    schedule 02.03.2010
comment
Да, я это видел. Но у меня было требование не изменять URL-адрес в адресной строке. - person Amit; 02.03.2010
comment
Он не перенаправляет на ASP - person JNF; 01.08.2013
comment
Это происходит везде, где вы перенаправляете. - person Jamie; 20.12.2013
comment
Это сделано только для конкретного случая использования в связанной статье. - person Mark Rucker; 04.02.2015