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