UPDATE
由于马蒂亚斯下面指出,这种确切的问题已经被报告并解决在这里: ASP.NET MVC的高流量(IIS6)错误:指定的转换无效
原帖
这可能是太特殊,无法在这里发表调试的问题,但我的,因为它会产生一个解决方案,其他人找到有用的希望无论如何张贴。
我有中度负载下运行的Web应用程序 - 每秒也许5个请求。 它有一些旧的代码通过ADO.NET +的DataReader交谈,SQL和一直使用同样的技术在至少五年没有问题。 它还具有使用LINQ到SQL一些较新的代码。 这两种技术都使用相同的连接字符串,以最大限度地提高连接池重用。
最近我遇到这些症状描述的非常怪异的行为:
一切都会很好地工作一天左右,然后突然每次调用(或几乎所有的调用)数据层(包括ADO.NET和LINQ)返回不能由我的代码解析的数据 - 我会得到“无法例外投型“System.Int32”的对象为类型“System.String”“。 或“序列不包含任何元素”或“IndexOutOfRangeException”或“无效试图调用读时读取器已关闭”。
有趣的是,我从来没有从SqlCommand.ExecuteReader()或DataReader.Read异常() - 例外,当我尝试解析返回的IDataRecord才会发生。
我能够重新启动SQL或IIS暂时解决问题。 几个小时后,它再回来。
我试过监控连接池中的连接数,它永远不会大于3左右。 当然,从来没有超过100。
我没有收到在事件日志中,表示与SQL或IIS的任何问题,任何东西。
该驱动器有9 GB空闲空间。
我怀疑坏的RAM,但服务器使用注册的ECC的DIMM。
我有使用ADO.NET是做工精细,从来没有出现此问题的其他应用程序。
当问题发生,我可以通过打电话Management Studio中的完全相同的存储过程和他们返回正确的,预期的结果。
这里是我的ADO.NET访问模式:
using (var dbConn = Database.Connection) // gets already-open connection
{
var cmd = new SqlCommand("GetData", dbConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", id);
SomeDataObject dataObject = null;
var dr = cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow);
if (dr.Read())
dataObject = new SomeDataObject(dr);
dr.Close();
return dataObject;
}
理论:有没有可能是ADO.NET的代码和LINQ的一部分代码的另一部分的组合,无论是使用连接池相同的连接,是有一些奇怪的副作用?
问:是否有我应该尝试任何调试步骤? 任何事件日志或性能指标,可以帮助?