我遇到了一个不经常发生的错误,但客户端已经看到了它,并希望它得到修复。
基本上,这是一个IndexOutOfRangeException异常,但奇怪的是跟踪指向系统。网状物HttpContext。电流。这怎么可能?
它失败的线路是这样的:
位于系统集合。ArrayList。在添加(对象值)系统集合。专业的名称对象集合库。BaseAdd(字符串名称,对象值)系统网状物会话状态。SessionStateItemCollection.set_Item(字符串名称,对象值)WebStateManager.set_Item(字符串键,对象值)在里面\WebStateManager.cs:line53位于中的UIStateManager.get_BookingParameters()WS\App_Code\Managers\UIStateManager.cs:line2746
索引超出的范围数组。
System.Web.HttpContext context = System.Web.HttpContext.Current;
如果是数组,我可以进行计数和其他检查,但除了尝试捕获之外,我还会在这里进行什么样的检查?在此处输入链接描述
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]
SessionStateItemCollection不是线程安全的(请参阅https://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateitemcollection(v=vs.110).aspx),并且可能有多个线程同时写入/读取会话状态。
您需要找到访问HttpContext的代码。会话或页面。会话,并确保代码没有在后台线程中运行。
请参阅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;
}
}
}