与web服务客户端间歇性错误
我们在部分生产服务器上看到间歇性问题。 间歇性地说,我的意思是,目前影响到我们总运行量的不到1%,并且只在我们的〜20台服务器中有两台显示(我们至少注意到了这一点)。
我们的设置是这样的:我们有一个自定义的软件,它是旧的VB6和C#.net代码的混合版本。 该计划是我们自己内部脚本的网页扫描引擎。 该程序通过服务器园区执行,每个服务器一次运行50-150个实例,每个实例都有一个单独的脚本。
会发生什么是在初始加载后的某个时候,问题中的程序将尝试联系web服务以获取一系列设置。 偶尔会遇到这个问题:
System.IO.FileNotFoundException:
Could not find file 'C:Documents and SettingsccrunLocal SettingsTempdriumfrd.dll'. File name: 'C:Documents and SettingsccrunLocal SettingsTempdriumfrd.dll'
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames)
at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
...
在此之后,我们的伐木限制就会被击中 .dll名称在每次执行时都不相同。 这是远离VB6代码的两层间接方向,所以我相当肯定这是一个纯粹的C#问题到目前为止,我在Google上能够找到的是,这与Web服务的动态编译有关客户端代码。 我的google-fu在什么地方停下来是为了找出为什么我们不会一直得到这个错误。 权限不能错,因为并非所有的工作都失败。 在同一台服务器上重新启动时,完全相同的作业将完成而不会出现任何错误。
我们唯一能够辨别的指标是,作业通常在群集中失败,其中大多数(但不是全部)作业同时开始(并且在同一台服务器上)会失败。 除此之外,我们在这里没有什么好处。
目前为止我发现的最佳链接是:http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/d7ea81e7-8fea-4056-ad21-f2fee1887bcc
编辑:这是非常非常奇怪的,经过一些额外的调查,我发现我们的日志中的错误信息有错误的错误代码。
public entry_function()
{
try
{
do stuff..
main_function();
}
catch (Exception exp)
{
// General error
_log.EventID = 57051;
_log.WriteToErrorLog(Log.Level.ERROR, "Unhandled exception", exp);
}
}
public main_function()
{
do more stuff...
helper function();
}
public helperfunction()
{
try
{
switch()
{
...
case WebServices.WSMarkAsInvalid:
{
// Info logger
_log.EventID = 57114;
_log.WriteToInfoLog(Log.Level.INFO, "Call WSMarkAsInvalid start");
new WSSystem.WSSystem().WSSystemMarkAsInvalid((string)parameters[0], (string)parameters[1], (int)parameters[2]);
// Info logger
_log.EventID = 57115;
_log.WriteToInfoLog(Log.Level.INFO, "Call WSMarkAsInvalid end");
return null;
}
}
}
catch(Exception exp)
{
_log.EventID = 57120;
_log.WriteToErrorLog(Log.Level.WARN, "Error communicating with webservice", exp);
}
}
忽略明显的伪代码位,我看到4个案例,其中57114后跟57120警告,39个案例57114后面是57051!
尽管匹配“任何”异常,但我完全不知所措,尽管我可以说,内部try / catch没有受到影响。
我最初的猜测基于你提供的堆栈跟踪,可能会说临时文件夹被填满容量,并且该文件没有写入临时文件夹,这就是为什么你会看到IO错误。 您可能需要检查您的应用程序是否生成了太多临时文件,并找出清除它们的机制。 但当然,这是早,我可能是完全错误的:)
我们的最终解决方案是彻底摆脱Webservices,直接通过SQL查询数据库。 不是最优雅的解决方案,但比每天都以完全不可预知的方式进行关键执行失败更好。
链接地址: http://www.djcxy.com/p/91873.html