我们有一个针对.NET 4.0编写的应用程序,它在周末崩溃,将以下消息放入事件日志中:
应用程序:PnrRetrieverService.exe Framework版本:v4.0.30319
描述:由于.NET运行时在IP 791F9AAA(79140000)处出现内部错误而导致进程终止,退出代码为80131506.
这是在Windows Server 2003 R2标准版框中.谷歌搜索这个错误没有发现任何相关的.例如,这不是在VS Studio中发生的,而是在生产框中发生; 当服务最终重新启动时,它没有遇到任何进一步的问题.
如何诊断.NET运行时中的错误?
我有一个多线程Windows服务,我用VS 2010(.NET 4.0)开发,可以有几个到几十个线程,每个线程通过Internet从慢速服务器检索数据,然后使用本地数据库记录这个数据(因此进程受Internet限制,而不是LAN或CPU绑定).
有一些规律性,我从几个线程同时得到以下错误的洪水/乱舞/爆发:
System.Data.SqlClient.SqlException(0x80131904):超时已过期.操作完成之前经过的超时时间或服务器没有响应.
此错误的调用堆栈通常是:
在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
在System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)
在System.Data.SqlClient.SqlConnection.Open()
我没有在连接字符串中指定连接超时,并且此数据库中还有其他应用程序和进程.有没有人遇到过这种行为,如果有的话,采取了哪些措施来防止它?
我的数据访问层中最常用的方法如下所示,我所有其他DAL方法都遵循相同的方法:
using (SqlConnection con = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand("AddGdsMonitorLogEntry", con))
{
cmd.CommandType = CommandType.StoredProcedure;
/* setting cmd.Parameters [snipped] */
// We have been getting some timeouts writing to the log; wait a little longer than the default.
cmd.CommandTimeout *= 4;
con.Open();
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
编辑
鉴于在镜像环境中发生这种情况的评论,我确实应该提到有问题的数据库是镜像的.它在SSMS中标记为"Principal,Synchronized","高安全性,无自动故障转移(同步)"模式.
编辑5/26/11
我在SQL Server日志中看不到任何问题.(我无法访问该服务器上的Windows事件查看器,但我已经要求有人找我.)
我正在使用一个列,我希望USER_NAME()在SQL Server 2008 R2中保存该函数的值.在BOL中,该函数被记录为具有返回类型NVARCHAR(256).
但是,在其中一个示例中,他们这样做:
SELECT name FROM sysusers WHERE name = USER_NAME(1)
Run Code Online (Sandbox Code Playgroud)
并且sysusers.name列有类型sysname,这是(据我所知)有效的NVARCHAR(128) NOT NULL.这种不一致性在文档中进一步巩固CURRENT_USER,其中说"此函数等效于USER_NAME()",但表明其类型是sysname(当然,它继续有一个示例,它使用CURRENT_USER作为VARCHAR(30)列的默认值... )
是什么赋予了?BOL的类型是错误的USER_NAME()吗?我使用它是否安全NVARCHAR(128)?
我一直在google搜索我可能找到的任何地方(包括在这里的Stackoverflow),以找出我试图将WCF服务部署到Windows 7 x64上的IIS 7.5上的错误,该服务仅通过基本HTTP身份验证的SSL运行.我在IIS中有一个站点,它具有绑定到端口50443的HTTPS以及自签名证书.(我不能使用标准端口443,因为我们计划在已经运行Tomcat的服务器上将其部署到IIS,该服务器正在监听80和443.)
这是web.config:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="SSLBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="HelloWorldWcf.HelloWorldWcfService">
<endpoint name="HelloWorldWcf.HelloWorldWcfService"
address="https://mylaptop:50443/HelloWorld/Service1.svc"
binding="basicHttpBinding"
bindingConfiguration="SSLBinding"
contract="HelloWorldWcf.IHelloWorldWcfService"/>
<endpoint address="https://mylaptop:50443/HelloWorld/Service1.svc/mex"
binding="mexHttpsBinding"
contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
如果我浏览到服务端点地址并手动输入基本身份验证凭据,则会在浏览器中显示以下异常错误消息:
提供的URI方案"https"无效; 预计'http'.
参数名称:context.ListenUriBaseAddress
这是我尝试针对类似服务运行WCF客户端时出现的相同错误,除了它以"参数名称:via"结尾(因为调用堆栈中显示的方法的参数名称为"System.ServiceModel"). Channels.TransportChannelFactory`1.ValidateScheme(URI via)",实际上是"via").
我已经调整了服务器和客户端配置文件很多次我失去了轨道,但上面的web.config文件是我迄今为止最好的猜测 - 它甚至不能在浏览器中运行,更不用说WCF客户端了.
通过HTTPS进行基本HTTP身份验证,在非标准SSL端口上访问IIS 7.5中托管的WCF服务需要做什么?救命!(& 谢谢!)