2016-10-08 2 views
0

J'ai donc développé une application dans MVC sur C#. Tout fonctionne parfaitement et en douceur localement.L'objet de session devient null sur Azure

J'ai décidé de monter le tout sur Microsoft Azure. Mon objet de session devient null pour une raison quelconque, provoquant l'expiration d'une session à cause de mes validations. Ceci est aléatoire, parfois après quelques secondes, parfois après une minute. Je suis sûr que ce n'est pas à cause du temps d'inactivité parce que cela arrive quand je clique sur des choses.

C'est ma méthode de connexion où je crée mon objet:

public ActionResult Login(MyWebApplication.Models.LoginRQ User) 
    { 
     if (ModelState.IsValid) 
     { 
      MyWebApplication.Models.LoginRS login = new MyWebApplication.Models.LoginRS(); 
      try 
      { 
       MyWebApplication.LoginBusiness LoginProxy = new MyWebApplication.LoginBusiness(); 
       login = LoginProxy.Login(User); 

       if (login.Logged == false) 
       { 
        ViewBag.MessageError = Wrong user"; 
       } 

       Session["InfoUser"] = login; 
       return RedirectToAction("Index","Inicio"); 
      } 
      catch (Exception ex) 
      { 
       ViewBag.MessageError = ex.Message; 
      } 

     } 
     return View(User); 
    } 

Ceci est ma validation sur toutes les méthodes:

public static bool ValidateSession(MyWebApplication.Models.LoginRS InfoUser) 
    { 
     if (InfoUser == null) 
     { 
      throw new ArgumentException("SESSION EXPIRED"); 
     } 
     return true; 
    } 

J'utilise cette validation lorsque instancier une méthode de ma couche d'affaires. Par exemple, il s'agit de ma couche de gestion pour le client CRUD:

Classe publique CustomerBusiness { internal MyWebApplication.Models.LoginRS InfoUser; MyWebApplication.Models.Customer interne OBJRES_Residentes = new MyWebApplication.Models.Customer();

[Logger] 
    public CustomerBusiness(MyWebApplication.Models.LoginRS InfoUser) 
    { 
     MyWebApplication.LoginBusiness.ValidateSession(InfoUser); 
     this.InfoUser = InfoUser; 
    } 

} Comme vous pouvez le voir, j'ai besoin InfoUser donc je me connecte sur les opérations nomUtilisateur CRUD.

Cela fait partie de mon WebConfig:

<system.web> 
    <sessionState mode="InProc" timeout ="20" cookieless="false"></sessionState> 
    <customErrors mode="Off"> 
    </customErrors> 
    </system.web> 

Non permet de parler de la façon dont je configuré cela sur Azure. J'ai créé une WebApplication et une base de données SQL Server Azure. Ceci est une image:

Azure_Portal

Cela est si frustrant que je pense à l'aide de cache DB, même si je sais que la performance serait affectée.

Des idées? J'apprécie vraiment votre aide les gars

+0

Où cette méthode de validation est-elle appelée? – khlr

+0

Que se passe-t-il si vous utilisez plutôt system.web.httpcontext.current.session? –

+1

Comment avez-vous déployé: les applications Web? Comment gérez-vous votre session: in-proc? S'il vous plaît modifier votre question avec plus de détails. –

Répondre

1

Vous le faites dans le mauvais sens. Vous devriez avoir votre propre serveur d'état, plutôt que de stocker la session sur le serveur Web. L'idée d'utiliser Azure consiste à ajouter une échelle élastique au besoin.

Voici quelques options:

1 Ajouter Azure Redis Cache et en faire votre gestionnaire de session à toutes les instances de votre application web;

https://azure.microsoft.com/en-us/documentation/articles/cache-aspnet-session-state-provider/

2-utilisation Sql base de données pour gérer l'état.

https://azure.microsoft.com/en-us/blog/using-sql-azure-for-session-state/

+0

Je suis d'accord.S'il a plusieurs instances, il n'y a aucune garantie Azure acheminera toujours la requête à l'instance où la session a été créée. –