我发布这个问题堆栈溢出,但无济于事。 在这里变得绝望。
所以我们在C#ASP.NET MVC5应用程序中出现了一个非常随机的错误(我的意思是,错误前面没有使用模式),这个错误发生在我们的生产环境中。
这个错误似乎只在用户login后才出现,整个系统崩溃,所有用户都无法访问,直到我们手动进入IIS8并重新启动Web服务器。 我们正在使用IIS的Windows Server 2012环境上运行SQL Server Express 2012 SP2。
错误信息如下:
IndexOutOfRangeException/Account/Login Index was outside the bounds of the array.
堆栈跟踪如下:
IndexOutOfRangeException·Index was outside the bounds of the array. Raw :0System.Data.SqlClient.SqlDataReader.CheckHeaderIsReady(Int32 columnIndex, Boolean permitAsync, String methodName) :0System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i) :0System.Data.Entity.Core.Common.Internal.Materialization.Shaper+ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal) :0lambda_method(Closure , Shaper ) :0System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly(Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) :0lambda_method(Closure , Shaper ) :0System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) :0System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1+SimpleEnumerator+<MoveNextAsync>d__4.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0System.Data.Entity.Internal.LazyAsyncEnumerator`1+<FirstMoveNextAsync>d__0.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions+<FirstOrDefaultAsync>d__25`1.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0Microsoft.AspNet.Identity.TaskExtensions+CultureAwaiter`1.GetResult() :0Microsoft.AspNet.Identity.EntityFramework.UserStore`6+<GetUserAggregateAsync>d__6c.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0Microsoft.AspNet.Identity.TaskExtensions+CultureAwaiter`1.GetResult() :0Microsoft.AspNet.Identity.UserManager`2+<FindAsync>d__12.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0Saleboat.Controllers.AccountController+<Login>d__9.MoveNext() :0System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) :0System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) :0System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) :0System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass37.<BeginInvokeAsynchronousActionMethod>b__36(IAsyncResult asyncResult) :0System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) :0System.Web.Mvc.Async.AsyncControllerActionInvoker+AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() :0System.Web.Mvc.Async.AsyncControllerActionInvoker+AsyncInvocationWithFilters+<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() :0System.Web.Mvc.Async.AsyncControllerActionInvoker+AsyncInvocationWithFilters+<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() :0System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) :0System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass21+<>c__DisplayClass2b.<BeginInvokeAction>b__1c() :0System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult)
这个错误只发生在我们的服务器/数据库上,不能被有意的复制,我们不得不等待它发生,并检查Bugsnag捕获的exception。
编辑
以下是login时执行的代码:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var user = await UserManager.FindAsync(model.UserName, model.Password); if (user != null) { var userId = UserManager.FindByName(model.UserName).Id; int companyId = db.Users.Find(userId).CompanyId; await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); } else { ModelState.AddModelError("", "Invalid username or password."); } } return View(model); }