2017-06-06 13 views
0

私は非常に頻繁に起こることはありませんが、クライアントがそれを見て、それを修正したいエラーが発生しています。どのような状況でC#ASP.NET HttpContext.Current.Sessionがスローすると、IndexOutOfRangeException?

基本的には、IndexOutOfRangeException例外だが、どのような奇妙なのはSystem.Web.HttpContext.Currentにトレースポイントということです。そんなことがあるものか?

それが失敗した行はこのようなものです: System.Collections.Specialized.NameObjectCollectionBase.BaseAdd(文字列 名で System.Collections.ArrayList.Add(Object値)で


ライン: WebStateManager.set_Item(文字列のキー、オブジェクト値) で\ WebStateManager.csで System.Web.SessionState.SessionStateItemCollection.set_Item(文字列 名、オブジェクト値)で、オブジェクト値) WS \にApp_Code \マネージャ\ UIStateManager.csでUIStateManager.get_BookingParametersで53():線 インデックスが配列の範囲外でした。

System.Web.HttpContext context = System.Web.HttpContext.Current; 

それが配列だった場合、私はカウントや他のチェックを行うことができますが、私はここでのtry-catch以外のチェックの種類をしますか? enter link description here

public class Example 
{ 
    public static void Main() 
    { 
     int[] values1 = { 3, 6, 9, 12, 15, 18, 21 }; 
     int[] values2 = new int[6]; 

     // Assign last element of the array to the new array. 
     values2[values1.Length - 1] = values1[values1.Length - 1]; 
    } 
} 
// The example displays the following output: 
//  Unhandled Exception: 
//  System.IndexOutOfRangeException: 
//  Index was outside the bounds of the array. 
//  at Example.Main() 

マイプロジェクトコード

public override object this[string key] 
     { 
      get 
      { 
       if (Helpers.CommonFunctions.IsHttpSessionNull) 
       { return null; } 

       return HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()]; 
      } 
      set 
      { 
       if (Helpers.CommonFunctions.IsHttpSessionNull) 
       { return; } 

       if (value == null) 
       { 
        try 
        { 
         if (HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()] != null) 
         { 
          HttpContext.Current.Session.Remove(key + Helpers.CommonFunctions.GetAppDomainMultiplexer()); 
         } 
        } 
        catch 
        { 
        } 
       } 
       else 
       { 
         HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()] = value; 

       } 
      } 
     } 

次のように障害のスタックトレースがあります。

0:072> !clrstack 
    OS Thread Id: 0x31ec (72) 
      Child SP    IP Call Site 
    000000aea766d968 000007f9736a4650 [HelperMethodFrame: 000000aea766d968] 
    000000aea766da50 000007f9674e0e5a System.Collections.ArrayList.Add(System.Object) 
    000000aea766da90 000007f966655292 System.Collections.Specialized.NameObjectCollectionBase.BaseAdd(System.String, System.Object) 
    000000aea766dae0 000007f9650ac4c9 System.Web.SessionState.SessionStateItemCollection.set_Item(System.String, System.Object) 
    000000aea766db20 000007f90ed89ce9 UTL.WebStateManager.set_Item(System.String, System.Object) 
    000000aea766dbf0 000007f90f29370c WebStateManagerHelper.get_OriginalPNR() 
    000000aea766dc80 000007f90f29242d QueryDynamicLoggingComponent.LogTransaction(System.String, System.String) 
    000000aea766e110 000007f90f2917e3 WSHelper.Log(System.String, System.String, Boolean, System.String) 
    000000aea766e160 000007f90f28fd17 WSHelper.GetResponse(System.String, SecurityInfo, System.String, System.String, System.String ByRef, System.String, System.String) 
    000000aea766e5d0 000007f90f29eae6 WSHelper.SendQuery(System.String, SecurityInfo, System.String) 
    000000aea766e7f0 000007f90f29e7f8 WSHelper.SendQuery(SecurityInfo, System.String) 
    000000aea766e840 000007f90f29e4af APIWSPool.SendAndReceiveQueryToString(Agency, System.String, Token, Boolean) 
    000000aea766e940 000007f90f29e374 APIWSPool.SendAndReceiveQuery(Agency, Token, Boolean) 
    000000aea766e9b0 000007f90f6168f4 FlightBookingManager.SearchFlightForMPSearchedFlightRecommendations1(Agency, FlightFareDrivenSearchInfo, Boolean) 
    000000aea766eb80 000007f90f615ec1 ApiFlightBookingProvider.SearchFlightForMPSearchedFlightRecommendations1(Agency, FlightFareDrivenSearchInfo, Boolean) 
    000000aea766ebe0 000007f90f6158f2 APICOM.Threading.OWCOutboundSearchThread.Work() 
    000000aea766edb0 000007f9674e2d45 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    000000aea766ef10 000007f9674e2ab9 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    000000aea766ef40 000007f9674e2a97 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    000000aea766ef90 000007f9674fa161 System.Threading.ThreadHelper.ThreadStart() 
    000000aea766f2a8 000007f96e0eab53 [GCFrame: 000000aea766f2a8] 
    000000aea766f5f8 000007f96e0eab53 [DebuggerU2MCatchHandlerFrame: 000000aea766f5f8] 
    000000aea766f788 000007f96e0eab53 [ContextTransitionFrame: 000000aea766f788] 
    000000aea766f9a8 000007f96e0eab53 [DebuggerU2MCatchHandlerFrame: 000000aea766f9a8] 

答えて

0

SessionStateItemCollectionはスレッドセーフではありません(https://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateitemcollection(v=vs.110).aspxを参照)、そして、あなたはおそらく、複数のスレッドが同時にセッション状態からの読み取り/書き込みを持っています。

HttpContext.SessionまたはPage.Sessionにアクセスするコードを見つけ、コードがバックグラウンドスレッドで実行されていないことを確認する必要があります。

https://msdn.microsoft.com/en-us/library/system.indexoutofrangeexception(v=vs.110).aspxを参照してください - (「違反スレッドの安全性」を検索)以下

がしようとすると、問題を回避するために、ロック使用して、いくつかのサンプルコードです。このコードは非常に速く汚れています。私はそれをお勧めしません。しかし、あなたのシステムを再構築することができない場合、それは価値があるかもしれません。このテクニックを使用する場合は、 Sessionを使用するたびににする必要があります。

public override object this[string key] 
    { 
     get 
     { 
      if (Helpers.CommonFunctions.IsHttpSessionNull) 
      { return null; } 

      lock (HttpContext.Current.Session) 
      { 
       return HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()]; 
      } 
     } 
     set 
     { 
      if (Helpers.CommonFunctions.IsHttpSessionNull) 
      { return; } 

      lock (HttpContext.Current.Session) 
      { 
       if (value == null) 
       { 
        try 
        { 
         if (HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()] != null) 
         { 
          HttpContext.Current.Session.Remove(key + Helpers.CommonFunctions.GetAppDomainMultiplexer()); 
         } 
        } 
        catch 
        { 
        } 
       } 
       else 
       { 
        HttpContext.Current.Session[key + Helpers.CommonFunctions.GetAppDomainMultiplexer()] = value; 

       } 
      } 
     } 
+0

タスク/スレッド/バックグラウンドワーカーなどを作成するコードはありますか? – mjwills

+0

こんにちはmjwills、 私は知っている、このオブジェクトはまだ(セッションの状態)のプロジェクトからですが、ネイティブasp.netセッションマネージャ(asp.netセッションオブジェクトが削除されました)によって削除されています。この問題は、環境に対して再現可能なローカル/ライブではありません。唯一起こっているのはProcution環境です。 – hodoor

+0

あなたはそれが@ONURDİKMENの原因だと思いますか?セッションが終了しても、あなたが見ている例外を取得すべきではありません。その例外の最も一般的な原因は、Sessionオブジェクトへのマルチスレッドアクセスです。 https://stackoverflow.com/questions/24987909/is-session-variable-thread-safe-within-a-parallel-for-loop-in-asp-net-pageを参照してください。 – mjwills

関連する問題