与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

上一篇: intermittent error with webservice client

下一篇: Generic WebService (SOAP) client library for C++