我们这里有一个奇怪的错误。在我们的ASP.NET 4.6应用程序中,使用Entity Framework 6.2,我们在访问SQL Azure数据库时收到“用户登录失败”。我很确定错误的原因是在Azure中切换层。我没有得到的是为什么没有发现错误。我们的每个SQL操作都在try ... catch块中。错误从块中掉出来并在应用程序崩溃之前被Globals.asax捕获。 我们有
SetExecutionStrategy("System.Data.SqlClient", Function() New SqlServer.SqlAzureExecutionStrategy(10, TimeSpan.FromSeconds(7)))
根据我的理解,它将从第一个错误开始重试任何SQL执行10次至少70秒。根据微软的技术支持,这没有参与,因为它尚未与SQL Azure建立连接。连接字符串中的ConnectRetryCount和间隔不适用,因为它正在与服务器通信。服务器只是说,“我知道你在那里,但我不会让你进去!” 根据MS Tech的支持,解决这个问题的唯一方法是在我们所有的SQL命令周围进行try ... catch块...我们这样做!它刚刚崩溃并崩溃了应用程序!
我无法在globals.asax中重试,因为此时它已经崩溃了。 根据MS,没有办法在上下文中捕获错误并从那里重试。那么,解决方案是什么?除了“只是让应用程序崩溃并让它们刷新页面!”之外,必须有一些答案。
几秒钟后刷新页面,一切都很好。没有错误,没有问题。
抛出错误的一行代码示例:
MapTo = ctx.BrowserMaps.FirstOrDefault(Function(x) code.Contains(x.NameOrUserAgent))
这真的很直接。这个恰好出现了很多,因为这个代码块经常被调用。实际的SQL请求是无关紧要的,因为无论使用什么行,EF中的连接都会失败。
答案 0 :(得分:2)
在向上/向下扩展到新层时将断开服务器登录,并回滚事务。但是,包含的数据库登录在扩展过程中保持连接,因此建议使用它们而不是服务器登录。
尝试捕获可能无法解决问题,因为您可能正在捕获错误#零,并且Azure SQL数据库中的许多错误属于该错误0类别。
只是一个评论,缩放后的性能可能在缩放后很差,并在几分钟后改善。查询计划也可能会发生变化。