2009-09-24 8 views
2

J'ai ci-dessous dans mon global.asax Session_Start.net l'état de session a créé un identifiant de session, mais ne peut pas l'enregistrer parce que la réponse a déjà été rincé par l'application

string myBrowser = Utils.SafeUserAgent(Request); 
foreach (string bannedbrowser in BrowserBan.BrowsersToBan) 
{ 
    if (myBrowser.IndexOf(bannedbrowser, StringComparison.OrdinalIgnoreCase) > -1) 
    { 
     HttpContext.Current.Response.Redirect("/bannedBrowser.htm"); 
     Session.Abandon(); 
     break; 
    } 

Il empêche transcodeurs accès o mon site. mais chaque maintenant et puis-je obtenir une erreur en disant

System.Web.HttpException: Session state has created a session id, but cannot 
    save it because the response was already flushed by the application. 
    at System.Web.SessionState.SessionIDManager.SaveSessionID(
     HttpContext context, String id, Boolean& redirected, Boolean& cookieAdded) 
    at System.Web.SessionState.SessionStateModule.CreateSessionId() 
    at System.Web.SessionState.SessionStateModule.DelayedGetSessionId() 
    at System.Web.SessionState.SessionStateModule.ReleaseStateGetSessionID() 
    at System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, 
     EventArgs eventArgs) 
    at System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, 
     EventArgs eventArgs) 
    at System.Web.HttpApplication.SyncEventExecutionStep.System.Web 
     .HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, 
     Boolean& completedSynchronously) 

cela, il ne se produit que lorsque je tente d'accéder via (par exemple) Google Transcoder mais je veux comprendre pourquoi cela arrive et comment puis-je l'empêcher.

Je dois abandonner la session afin que l'agent utilisateur de rafraîchissement soit réévalué.

+0

En aparté: Ce que vous semblez faire (empêcher certains navigateurs d'accéder à une page) serait considéré comme une mauvaise pratique dans la plupart des circonstances. Vous utilisez probablement la chaîne User-Agent envoyée par le client, qui peut facilement être usurpée. Si vous souhaitiez simplement avertir les utilisateurs des problèmes d'incompatibilité potentiels, cela serait raisonnable. Mais à partir de la langue que vous utilisez ("navigateur banni"), je suppose que c'est plus qu'un avertissement d'incompatibilité. Vous le savez peut-être déjà et avez vos raisons de le faire, bien sûr. Je voulais juste vous assurer de garder les pièges à l'esprit. –

+0

C'est un site mobile et parfois les utilisateurs de google search y accèdent via le transcodeur web de google qui supprime tout et tue l'expérience de l'utilisateur. Et parfois, les personnes/membres utilisent le transcodeur gogole comme proxy. – nLL

+0

La réponse est ici: http://stackoverflow.com/questions/904952/whats-causing-session-state-has-created-a-session-id-but-cannot-save-it-becau/1966562#1966562 – Adi

Répondre

2

Avez-vous essayé d'inverser l'ordre d'abandon de votre session par rapport à la redirection?

Session.Abandon(); 
HttpContext.Current.Response.Redirect("/bannedBrowser.htm", true); 
+0

J'ai fait cela mais il faudra du temps pour voir le résultat car je ne reçois pas d'erreur sur chaque demande de transcodeur – nLL

+0

@JustLoren - Avait exactement le même problème et votre solution l'a résolu ;-) merci. – MaYaN

4

Avez-vous vu this thread?

je rencontrais cette exception (dans un contexte différent) et fixé à ce qui suit ...

void Session_Start(object sender, EventArgs e) 
{ 
string id = Session.SessionID; 
} 
+0

comment serait assiging sessionid à une chaîne m'aiderait? Je n'ai pas besoin d'identifiant de session une fois que je sais que c'est un transcodeur. Je ne veux pas attribuer un ID de session une fois qu'il est vidé, car j'ai besoin de vérifier la prochaine requête s'il s'agit d'un transcodeur. – nLL

+0

Supposément, l'accesseur get 'SessionID' a un comportement à effet secondaire qui provoque l'initialisation de l'ID de session lors de son accès. L'événement 'Session_Start' est probablement assez tôt dans le cycle de vie de la page pour que l'ID de session soit sauvegardé en toute sécurité à un moment donné et ne produise pas l'erreur dans OP. Il ne s'agit donc pas d'obtenir la valeur de chaîne de l'ID de session, mais de simplement provoquer l'exécution de l'accesseur 'SessionID'. – JLRishe