无法找到程序集 - 无法跟踪错误

6

我有一个网站,运行在IIS 7.0中的集成v4.0应用程序池中。

从今天开始,在Windows事件日志中出现以下异常。这个网站已经上线1个月了,之前从未出现过这种异常。每小时的同一分钟都会出现异常,这有点奇怪。

可能的原因:

我有一个创建的库,动态加载。

 _searchProvider = (ISearchProvider)Activator.CreateInstance("SolrSearchProvider", "SearchProviders.SolrSearchProvider.SolrSearchProvider").Unwrap();

那个库引用了SolrNet。

你有什么想法,如何进一步调查找到解决方案?

An unhandled exception occurred and the process was terminated.

Application ID: DefaultDomain

Process ID: 7192

Exception: System.Runtime.Serialization.SerializationException

Message: Unable to find assembly 'SolrNet, Version=0.4.0.1001, Culture=neutral, PublicKeyToken=bc21753e8aa334cb'.

StackTrace:    at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
   at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.AppDomain.Deserialize(Byte[] blob)
   at System.AppDomain.UnmarshalObject(Byte[] blob)

我将此故障与在与网站同一文件夹中的资源文件夹内创建大量新文件夹和新图像文件有关联。
我知道ASP.NET会在删除文件夹时重启应用程序池。这个新的资源文件夹被创建后,ASP.NET重新加载程序集是否会导致某些问题?
Mauricio Scheffer说:@Dorin:那么真正的问题是循环依赖性。我建议发布一个新问题来解决这个问题。
我解决了循环依赖的问题,但是我仍然在Windows事件日志中收到相同的错误。
首先我收到“无法找到程序集'SolrNet,Version = 0.4.0.1001,Culture = neutral,PublicKeyToken = bc21753e8aa334cb'”,然后Web应用程序正在重新启动。
在我在Windows日志中收到异常之前的3到10秒钟时间内,我在我的站点日志文件中识别出一个异常,该异常是由实体框架引发的,因为我试图插入与现有项目具有相同主键的项。该异常没有在代码中处理,但由于CustomErrors设置,它被ASP.NET处理。
<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="/Error.aspx"/>
</customErrors>

这与Windows日志文件中的错误有关吗?


请问您为什么要动态加载程序集? - Mauricio Scheffer
因为在某个时间点上,我想要轻松地在不同的搜索提供程序实现之间进行切换。不过将项目包含为引用并直接创建实例是一个好主意。 - Dorin
所以现在我一直遇到的错误就停止了。我认为它只会在网站上有很多流量时出现。你能想到什么原因吗? - Dorin
2
@Dorin:你想在运行时更改搜索提供程序吗?你考虑过使用MAF或普通的IoC容器吗? - Mauricio Scheffer
@Dorin:那么真正的问题是循环依赖。我建议您发布一个新问题来解决这个问题。 - Mauricio Scheffer
显示剩余2条评论
3个回答

7
我在一篇博客文章中发现了这个语句,除了主题外,它还谈到了 应用程序池为什么可能会崩溃

“一个与请求不相关的线程中未处理的异常将导致进程崩溃。即使您使用 Application_Error 方法设置了处理程序,也会发生这种情况。”

对于某些类型的请求,我从请求线程创建8个新线程,以便同时查询我的 SOLR 的 8 个不同核心。在其中一个核心中,我遇到了一个未处理的异常,这让我陷入了发布的问题中。
我希望如果其他人遇到类似的错误,这可以帮助他们。非常感谢大家的帮助。由于你们的回答,我改善了我的代码,并发现和修复了与问题无关的其他错误。此外,我开始更深入地了解 ASP.NET 如何加载程序集,这对我很有帮助。

0

程序集安装在哪里?是在GAC还是bin文件夹中? 托管提供商是否更改了其设置? 尝试在配置文件中设置探测路径,CLR在其中搜索dll。


在 bin 文件夹中。我会尝试并回来给你答复。谢谢。 - Dorin
我管理Web服务器,没有进行任何设置。请查看其他回复中的评论。明天我会过来告诉你更改一些加载路径是否有效。谢谢。 - Dorin
现在我不再动态加载任何库,但我仍然遇到了这个异常。请参见我的问题编辑。 - Dorin

0

你记得将程序集添加到应用程序的工作目录中了吗?

必须将其放在那里,以便序列化器可以找到它并加载类型。

只需手动在资源管理器中复制它,或编写一些方法将文件复制到工作目录中即可。


我当时做了那件事,但它并没有解决我的问题。结果证明,这不是我一开始认为的程序集加载问题,而是一个线程中未处理的异常。 - Dorin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接