2016-10-08 9 views
0

したがって、私はC#でMVCでアプリケーションを開発しました。すべてが完璧かつスムーズに動作します。セッションオブジェクトがAzureでnullになる

私はMicrosoft Azureにすべてを搭載することに決めました。何らかの理由でMy Sessionオブジェクトがnullになり、検証のためセッションが期限切れになります。これは無作為で、時には数秒後に、場合によっては1分後に時折行われます。私は物事をクリックしているときに起こるので、これは非アクティブの時間のためではないと確信しています。

これは私が私のオブジェクトを作成し、私のログイン方法です:

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); 
    } 

これは、あらゆる方法で私の検証です:

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

私のビジネス層からメソッドをinstanciatingとき、私はこの検証を使用します。たとえば、これは顧客CRUDのビジネスレイヤーです。

public class CustomerBusiness { internal MyWebApplication.Models.LoginRS InfoUser; 内部MyWebApplication.Models.Customer OBJRES_Residentes = new MyWebApplication.Models.Customer();

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

} あなたが見ることができるように、私はので、私CRUD操作上のユーザ名をログInfoUserを必要としています。

これは私のWebConfigの一部です:

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

ありませんが、私はAzureの上でこれをどう設定したかについて話をすることができます。 WebApplicationとSQL Azure DBを作成しました。

Azure_Portal

これは私が、私はパフォーマンスが影響を受けるだろう知っている場合でも、DBキャッシュを使用して考えていますようにイライラさせられる。これはイメージです。

アイデア?私はあなたの助けの人に本当に感謝します

+0

この検証方法はどこで呼び出されますか? – khlr

+0

代わりにsystem.web.httpcontext.current.sessionを使用するとどうなりますか? –

+1

どのように展開しましたか:Webアプリケーション?どのようにセッションを管理していますか?詳細を入力して質問を編集してください。 –

答えて

1

あなたは間違った方法でそれをやっています。セッションをWebサーバーに保存するのではなく、独自のState Serverを用意する必要があります。 Azureを使用するという考えは、必要に応じて弾力的なスケールを追加することです。ここで

いくつかのオプション:

AzureのRedisのキャッシュを1-追加し、Webアプリケーションのすべてのインスタンスにあなたのセッションマネージャ作ります。

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

2使用状態を管理するためのSQLデータベース。

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

+0

私は同意します。彼が複数のインスタンスを持っている場合、Azureは常にセッションが作成されたインスタンスにリクエストをルーティングする保証はありません。 –

関連する問題