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

本文关键字:错误 服务 客户端 web | 更新日期: 2023-09-27 18:18:31

我们发现一些生产服务器出现了间歇性问题。我所说的间歇性是指目前影响的作业不到总运行作业的1%,并且只出现在我们约20台服务器中的2台(至少我们已经注意到这一点)。

我们的设置如下:我们有一个定制的软件,它是旧的VB6和c# .net代码的标准化版本。该程序是我们自己的内部脚本的网页抓取引擎。该程序跨服务器园区执行,其中每个服务器一次运行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的名称都是不同的。这是2层间接远离VB6代码,所以我相当确定这是一个纯粹的c#问题到目前为止,我在Google上能够找到的是,这与web服务客户端代码的动态编译有关。我的google-fu停止的地方是找出为什么我们不会一直得到这个错误。权限不可能出错,因为并非所有作业都失败。当在同一台服务器上重新启动时,完全相同的作业将没有任何错误地完成。

我们能够识别的唯一指标是作业通常在集群中失败,其中大多数作业(但不是所有作业)在同一时间(在同一台服务器上)启动会失败。除此之外,我们真的没有什么好东西可以参考。

到目前为止,我找到的最好的链接是:http://social.msdn.microsoft.com/forums/en us/asmxandxml/thread/d7ea81e7 - 8有限元- 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没有被击中,尽管匹配了"any"异常。

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

根据您提供的堆栈跟踪,我的初步猜测是,临时文件夹被填满了,而该文件没有被写入临时文件夹,这就是为什么您看到IO错误。您可能需要检查您的应用程序是否生成了过多的临时文件,并制定一种清除它们的机制。当然,现在还为时过早,我可能完全错了。

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