Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IIS中托管后代码意外工作_C#_.net_Foreach_Iis 10 - Fatal编程技术网

C# 在IIS中托管后代码意外工作

C# 在IIS中托管后代码意外工作,c#,.net,foreach,iis-10,C#,.net,Foreach,Iis 10,下面是构建缓存的代码,该缓存存储在当前应用程序域中加载的程序集中找到的(typeName,type) 当我试图从一个特定的程序集(比如assemblyK)加载类型时,我遇到了这个奇怪的问题。assemblyK大约有954种类型。日志是同步的,在VisualStudio中本地托管时,它可以很好地工作。此外,当我在IIS中部署网站时,它在第一次调用buildCache时运行良好 但是,当应用程序池重新启动时/稍后调用后,它将仅对5种类型运行嵌套循环,并继续执行下一个函数,即它不会引发任何异常并向前移

下面是构建缓存的代码,该缓存存储在当前应用程序域中加载的程序集中找到的(typeName,type)

当我试图从一个特定的程序集(比如assemblyK)加载类型时,我遇到了这个奇怪的问题。assemblyK大约有954种类型。日志是同步的,在VisualStudio中本地托管时,它可以很好地工作。此外,当我在IIS中部署网站时,它在第一次调用buildCache时运行良好

但是,当应用程序池重新启动时/稍后调用后,它将仅对5种类型运行嵌套循环,并继续执行下一个函数,即它不会引发任何异常并向前移动

private static void BuildCache()
{
    Assembly[] assemblies= AppDomain.CurrentDomain.GetAssemblies();

    foreach(Assembly assembly in assemblies){

    if(assembly.GlobalAssemblyCache){
    if(assemblly.ToString().Contains("assemblyK"))
    Logger.Log("GAC");
    continue;
    }
    try
    {
    if(assembly.ToString().Contains("AssemblyK"))
    {
    string allTypes = string.Join(",",assembly.GetTypes().Select(x => x.ToString()).ToArray())
    Logger.Log("All types :{0}",allTypes);
    }

    foreach(Type type in assembly.GetTypes())
    {
      if(assembly.ToString().Contains("AssemblyK"))
    {
    Logger.Log("Type parsed :{0}",type);
    }
    if(!typeCache.ContainsKey(type.FullName))
    {
     if(assembly.ToString().Contains("AssemblyK"))
    {
    Logger.Log("Adding to cache :{0}",type);
    }
    typeCache.Add(type.FullName,type);
    }        
    } 
catch(Exception ex)
{
Logger.Log("Exception Caught : {0}",ex.ToString());
} 
}   
}

值得注意的是,Visual Studio 2008中.Net 3.5版本中的AssemblyK.dll内部版本运行良好,并且在Visual Studio 2019中编译时会导致此问题。应用程序池是2.0。并且assemblyK始终加载在“assemblies”中。请帮忙

注意:我将在这两种情况下收到的所有类型的日志(当它工作和不工作时)复制到两个文件中,并使用cmd与fc file1 file2进行文件比较。 两者都包含相同的数据,即954种类型。所以我的问题是foreach如何随机运行?这里可能有什么问题

更新:日志内容如下:

1) 在工作情况下: 所有类型:类型1、类型2、类型3、…类型954

类型解析了954次

添加到缓存954次

2) 在不工作的情况下: 所有类型:类型1,类型2,类型3,…类型954

输入Pased 4次


typeCache是一个私有的静态只读字典

,因此总结一下,如果使用VS2008编译AsseblyK,则缓存可以工作,但如果使用VS2019编译AsseblyK,则缓存不能工作?几乎可以。它在第一次运行时运行良好,也就是说,当我在VS2019中构建并将其粘贴到bin中时,之后就不会了。我无法理解的一点是,它如何能够跳过for循环中的其余类型。我建议您发布一个完整的工作示例,typeCache是如何定义的?有编译错误(contains->contains,toString->toString)等),日志输出是什么?我猜在非工作版本中“添加到缓存”没有被记录?异常处理是我的一个恼怒,你的问题可能归结为你做错了
catch(Exception ex)
是在致命异常之后进行的,这是异常处理的主要问题。我想你在代码中也遇到了类似的问题,这可能隐藏了你真正的问题。以下是我经常链接的两篇关于异常处理的文章:|根据您的建议更新了问题@VentsyslavRaikov,您是对的,它没有与5个类型之后解析的类型一起记录。