Web服务客户端出现间歇性错误

时间:2011-12-22 13:34:24

标签: c# .net try-catch webservice-client

我们看到一些生产服务器出现间歇性问题。通过间歇性我的意思是,这目前影响不到我们总工作量的1%,并且只出现在我们的~20台服务器中的2台(我们至少已经注意到这一点)。

我们的设置如下: 我们有一个定制软件,它是旧VB6和C#.net代码的混合版本。该程序是我们自己的内部脚本的webscraping引擎。该程序在服务器园区中执行,每个服务器一次运行50-150个实例,每个实例都有一个单独的脚本。

在初始加载后的某个时候,问题中的程序会尝试联系Web服务以获取一组设置。偶尔,我们会遇到这个问题:

System.IO.FileNotFoundException: 
Could not find file 'C:\Documents and Settings\ccrun\Local Settings\Temp\driumfrd.dll'.  File name: 'C:\Documents and Settings\ccrun\Local Settings\Temp\driumfrd.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代码是2层间接,所以我很确定这是一个纯粹的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没有被击中,尽管匹配“任何”异常。

2 个答案:

答案 0 :(得分:2)

我最初的猜测是基于你提供的堆栈跟踪,就是说temp文件夹已经填满了容量而且该文件没有写入temp文件夹,这就是你看到IO错误的原因。您可能需要检查您的应用程序是否生成了太多的临时文件,并找出了清除它们的机制。但当然,现在还早,我可能完全错了:)

答案 1 :(得分:0)

我们的最终解决方案是完全脱离Webservices,而是直接通过SQL查询数据库。不是最优雅的解决方案,但比关键执行每天都以完全不可预测的方式失败更好。