2

我们一直遇到间歇性问题,导致用户被强制退出应用程序。

我们的设置是 Windows Server 2003 Standard Edition 上的 ASP.Net/C# Web 应用程序,后端使用 SQL Server 2000。我们最近在客户的 VMWare 服务器上进行了一次重大的产品升级(我们有一个专用于我们的来宾实例),虽然我们在之前的版本中没有遇到这些问题,但新升级给产品带来的额外复杂性导致了很多问题。我们还在同一个机器上运行 SQL Server 2000(内部版本 8.00.2039,或 SP4)和 IIS/ASP.NET (.Net v2.0.50727) 应用程序,并通过 TCP/IP 连接相互连接。


首先,抛出的异常是:

System.IndexOutOfRangeException:找不到表 0。

System.ArgumentException:列“密码”不属于表 Table。

[这个异常出现在登录脚本中,虽然明明有密码栏可用]

System.InvalidOperationException:已经有一个打开的 DataReader 与此命令关联,必须先关闭。

[这个经常发生]

System.InvalidOperationException:此 SqlTransaction 已完成;它不再可用。

System.ApplicationException:ExecuteReader 需要一个打开且可用的连接。连接的当前状态是正在连接。

System.Data.SqlClient.SqlException:超时已过期。在操作完成之前超时时间已过或服务器没有响应。

就在今天,第一次:

System.Web.UI.ViewStateException:无效的视图状态。


我们已经使用与生产服务器相同数量的并发用户对应用程序进行了负载测试,并且无法重现这些错误。它们非常断断续续,即使只有 8/9/10 个用户连接也会发生。我的直觉告诉我它的 ASP.NET - SQL Server 2000 连接问题..

在这个阶段,我们几乎排除了代码级数据访问层错误(我们有一个由 15 名经验丰富的开发人员组成的开发团队致力于此),因此我们认为这是一个特定的生产服务器环境问题。

4

3 回答 3

1

Invalid Viewstate 错误在高流量网站中非常常见。不过,如果您最近移动到多个 Web 服务器,请确保您共享相同的机器密钥,以便在所有服务器上使用相同的密钥对 Viewstate 进行签名。http://www.codinghorror.com/blog/archives/000132.html

根据其他错误,我猜您正在跨多个线程使用共享连接。您的连接是否存储在静态变量、应用程序状态、会话状态或跨多个请求使用的其他对象中?也许某处有一个包含连接、命令或事务的哈希表。ADO.Net 对象都不是线程安全的。因此,请确保仅以单线程方式使用它们。

另一种可能性是您正在传递 ADO.NET 对象,而不是始终如一地处理它们并管理它们的范围。也许它们被缓存在请求上下文或类似的地方?

于 2009-01-12T08:26:09.423 回答
0

我知道你不想听到这个,但是比我说的更聪明的人(如果你不相信我,请查看 McConnell 的Code Complete ):

这可能是您的代码,您的直觉可能是正确的:

我的直觉告诉我它的 ASP.NET - SQL Server 2000 连接问题..

抛出的错误非常具体,从上下文来看,它们看起来只是在尝试连接并且遇到困难——如果它只发生在客户端的环境中,则可能表明虚拟机设置不正确访问主机上的 TCP 连接(在不同的实例下)。


您确定在迁移之前您的代码都没有更改,并且您之前的环境启用了这样的日志记录吗?它以前可能已经发生过(程度较轻),但是您的环境没有捕捉到它,因为您没有启用日志记录。

如果这不是问题,并且我正在正确阅读您的帖子:您正在客户端在其管道和带宽上提供的来宾实例上运行服务器?如果是这种情况,那么很可能(大约在升级的同时)更改了某些路由配置,或者进行了防火墙更改,或者实例所在的任何框都进行了一些更改,因为它以不同的方式处理您的东西。

如果您无法在您的环境中重现它,并且您100%确定它不是您的代码;那么从逻辑上讲,问题只能是他们的环境。

于 2009-01-08T12:44:07.400 回答
0

小伙子们,正如更新一样,事实证明问题与 VMWare 在大量使用下有关 - 多么有趣的一周!我们正在更改代码以适应 VMWare 环境,并且我们已经看到了一些改进。

感谢您的建议,我很感激。

于 2009-01-16T12:21:03.407 回答