2009-12-16 4 views
0

Dans mon application ce code:Response.Redirect ("page.aspx") ne fonctionne pas toujours

CreditsSubjectsNamesTeacherCount n = new CreditsSubjectsNamesTeacherCount(); 
Session["UserID"] = n.GenerateTeacherCountCrossRegions(txtStartYear.Text.CheckOnEmptyYear(), ((UserInformation)Session["UserInformation"]).UserName); 
Response.Redirect("page.aspx"); 


ne marche pas redirect si la méthode GenerateTeacherCountCrossRegions exécutait pendant une longue période (~> 10 min). Qu'est-ce qui peut causer ce problème?
PS: ajouté:
<httpRuntime executionTimeout="18000".. > mais cela n'a pas aidé.
Merci.

+0

Pourquoi la méthode GenerateTaeacherCountCrossRegions prend-elle plus de 10 minutes? peut-être que vous devriez vérifier cela avant de corriger seulement les symptômes .. – nWorx

+0

vous avez raison, mais il y a trop d'opérations effectuées ici et il n'y a pas de temps pour optimiser cet algorithme (le client est satisfait des HEURES d'attente 'va laisser la génération de rapport la nuit) + il ne paie pas pour cette fonctionnalité ..) – 0x49D1

Répondre

2

Le navigateur a cessé d'attendre la page, il n'y a plus de connexion. Le serveur envoie juste la redirection dans le vide, où personne n'écoute.

Démarrez le travail dans un thread séparé, de sorte que la réponse ne doit pas attendre pour qu'il se termine. Redirige vers une page qui se recharge de façon occa- sionnelle pour vérifier l'état du travail et redirige vers la page finale lorsque le travail est terminé.

Pour communiquer avec le thread d'arrière-plan, vous avez besoin d'un objet auquel les deux threads font référence. Vous pouvez stocker une référence à l'objet dans une variable de session afin que la page vérifiant l'état y ait accès.

+0

ajouté le fil d'arrière-plan + panneau de mise à jour supprimé sur la page et cela fonctionne maintenant :) (qui ne gère pas la fonctionnalité d'affichage de progression, mais reste..) – 0x49D1

3

La demande a expiré. Response.Redirect envoie une réponse HTTP demandant au navigateur de demander une page différente - si la requête a expiré au niveau du navigateur, il n'acceptera pas cette réponse.

+0

merci pour la réponse..J'ai eu la même pensée, mais en changeant executionTimeout dans web.config n'a pas aidé non plus.Peut-être que je avez-vous manqué quelque chose? – 0x49D1

+1

Le délai d'expiration est du côté du navigateur, donc la modification d'un paramètre sur le serveur n'aidera pas ... – RickNZ

+1

Je pense qu'il s'agit d'un délai d'attente côté client, pas quelque chose que vous pouvez contrôler dans un paramètre côté serveur ... –

0

La requête expirera, de sorte que le navigateur affichera une erreur plutôt que la page attendue. Notez que cela ne se produira probablement pas lors du débogage, uniquement lors du déploiement.

Pour les opérations de longue durée de ce type, envisagez une interface différente.

J'ai créé un système où les données analysées sont envoyées par courrier électronique à l'utilisateur lorsqu'il a été calculé: en interne, j'ai créé un thread BackgroundWorker pour faire le calcul qui utilise ensuite un MailMessage pour envoyer le rapport en tant que Pièce jointe PDF.

Questions connexes