web-dev-qa-db-fra.com

Server.Transfer lève une erreur lors de l'exécution d'une requête enfant. Comment résoudre?

J'ai une HttpModule en C # 2.0 qui gère les exceptions levées. Chaque fois que l'exception est levée, une page d'erreur (aspx) contenant une chaîne de requête sera appelée. Cela se fait par Server.Transfer().

Mais lorsque le contrôle tente d'exécuter Server.Transfer(), l'exception suivante est levée:

Erreur lors de l'exécution de la demande enfant pour [nom de page] .aspx.

Alors que Request.Redirect() fonctionne bien. 

J'ai essayé de définir EnableViewStateMac="false" dans la directive Page de la page vers laquelle la demande est transférée. Le problème persiste toujours.

Voici le code que j'ai essayé:

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

Une idée de comment cela peut être résolu?

29
Amit

J'ai trouvé une alternative à Server.Transfer ()

J'ai utilisé

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

Cela a résolu le problème.

18
Amit

J'étais connecté au pipeline de demandes dans l'événement OnPreRequestHandlerExecute et j'ai constaté que je ne pouvais pas utiliser Server.Transfer, car il provoquait la même erreur que la vôtre lors de l'exécution d'une demande enfant. 

L'utilisation de HttpContext.Current.RewritePath n'a pas fonctionné, car elle semblait être ignorée et je n'ai été redirigé nulle part.

Si vous utilisez IIS 7 et les versions ultérieures, vous pouvez utiliser Server.TransferRequest à la place, ce qui a fait l'affaire pour moi.

Cette réponse couvre les différences entre les deux méthodes: TransferRequest vs Transfer dans ASP.Net

10
Karl

Ma solution était différente:

Une requête en ligne a produit cet article de la Base de connaissances Microsoft qui indiquait que la solution consisterait à utiliser Response.Redirect au lieu de Server.Transfer.

J'ai changé la commande et j'ai reçu un message "message d'erreur 404" plus précis au lieu du message "erreur d'exécution de la demande enfant" cryptique.

Cela m'a amené à inspecter la chaîne de redirection et j'ai remarqué que mon chemin était désactivé.

J'ai corrigé la chaîne de transfert de "ErrorPage.aspx" à "../ErrorPage.aspx" (notez le changement de chemin) et Server.Transfer fonctionnait parfaitement.

8
ray

Si vous voyez cette exception se produire dans le VS.NET IDE lors du débogage, continuez au moins une fois et appuyez sur F5 pour continuer le débogage. Dans mon cas, la page réelle était rendue avec l'exception ASP.NET qui était vraiment à l'origine du problème. Dans mon cas, j'avais un contrôle asp:ChangePassword incorrectement formaté qui était en fait provoquant l'exception "Erreur d'exécution de la demande de l'enfant".

4
atconway

J'ai eu le même problème et j'ai découvert que cela avait à voir avec les chemins relatifs où Server.Transfer est en cours d'exécution et vers lequel vous redirigez. Dans mon cas, cela s'exécutait dans un sous-répertoire, donc la réponse de @ ray (l'ajout de ../ au début de l'URL) fonctionnait Cependant, lorsque j'ai ensuite exécuté dans le répertoire ci-dessus, la même chose s'est produite. Par conséquent, j'ai changé pour utiliser un chemin enraciné:

Server.Transfer("~/errorpage.aspx")
0
Tevin

Server.Transfer ("mywebpage.aspx") semble fonctionner uniquement lorsqu'une session existe déjà. 

Si aucune session n'a démarré, cette erreur est générée. Vous devez donc utiliser Response.Redirect ou une autre méthode.

0
Ben

Ce n'est pas un bug, c'est par conception. Voir http://support.Microsoft.com/kb/320439

0
Jamie