ASP.NET Web应用程序找不到程序集

时间:2010-03-30 00:16:59

标签: asp.net web-applications iis-6 assemblies crash

我昨晚部署了一个ASP.NET网络应用程序,当我今天早上醒来时,它非常慢,偶尔会抛出“服务不可用”错误。

我查看了事件查看器并填写了这些错误:

  

发生了未处理的异常,并且该过程已终止。

     

异常:System.Runtime.Serialization.SerializationException

     

消息:无法找到程序集'MonoTorrent,Version = 0.80.0.0,Culture = neutral,PublicKeyToken = null'

我很困惑,因为它在我部署它时工作得很好(MonoTorrent需要从跟踪器中检索出某些种子的播种机/ leechers数量 - 这很好用),但是它不再有效且无论何时代码使用MonoTorrent时,工作进程就崩溃了。

MonoTorrent.dll位于/ bin /目录中。


更新6/4/10:我使用其余的Web应用程序编译了MonoTorrent源代码,但是只要它使用MonoTorrent它仍会崩溃。但是,它现在说它是Unable to find assembly 'OpenPeer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null。在这里,OpenPeer是Web应用程序程序集的名称。

9 个答案:

答案 0 :(得分:4)

在这种情况下会发生这种情况:

ASP.NET应用程序创建一个后台线程,该线程抛出未捕获的异常。看起来ASP.NET捕获异常并希望将其记录到事件日志中。为此,它将此异常从Web应用程序的应用程序域发送到其自己的应用程序域(w3wp进程的默认属性)。这需要对异常进行序列化/反序列化。

如果异常是自定义异常(即由Web应用程序定义),则无法在ASP.NET的主应用程序域中反序列化,因为定义异常的程序集通常位于Web应用程序的bin目录中,而不是w3wp .exe是(c:\ windows \ system32 \ inetsrv)。这会导致序列化异常并导致w3wp崩溃。

有一些方法可以解决问题(以非常主观的方式 - 优先顺序):

  1. 在c:\ windows \ system32 \ inetsrv
  2. 中复制丢失的DLL
  3. 在GAC中安装缺少的DLL
  4. 删除异常原因(比说法语时更难说)
  5. 自己从后台线程中捕获所有异常并自行进行日志记录。
  6. 注意:

    • 如果使用WCF并且未捕获的异常是FaultException,则WCF吞下它并且没有崩溃
    • 如果未捕获的异常位于Web请求的主题中,则会出现黄色的死亡屏幕,而不是此序列化异常
    • 这似乎是ASP.NET中的一个错误
    • 以上实际上是我昨天对这个问题的调查的摘要,只是一个理论。我测试了修复程序1和4,以及使用FaultException。

答案 1 :(得分:1)

试试clearing the ASP.NET temp files。它之前解决了一些奇怪的问题。

否则,Fusion-logging可能会有所启发。

更新:@Charlie - 我不确定如何制作这些日志......看起来失败的日志来自不同的AppDomain。请注意,AppBase设置为“file:/// c:/ windows / system32 / inetsrv /”,AppName为w3wp.exe。

我非常确定事件查看器应该显示应用程序ID:LM / W3SVC /#/ ROOT,如果它也是默认的AppDomain。在这一点上,我所得到的只是随机猜测。

  1. 我注意到你正在运行x64 ...... MonoTorrent可能是require x86吗?
  2. 您是否仔细检查过该目录是否为IIS应用程序,并且是否配置了正确版本的ASP.NET?
  3. 是否有其他应用程序在此服务器上使用MonoTorrent?也许是WCF服务还是什么?我不确定序列化发生在哪里....
  4. 尝试挂钩AssemblyResolve event并手动加载。
  5. 你可以在开发机器上复制吗?如果没有,也许这是一个borked FX安装。卸载并重新安装。
  6. 重新启动,回收或停止/启动AppPool会暂时解决问题,还是会导致问题出现?
  7. 你可能也想输入你的截图文字,这样你就会得到一些Google的爱....

答案 2 :(得分:1)

以下是您可以尝试的一些内容..

1。)刷新ASP.Net Temp目录重新启动IIS 回收应用程序池

2。)如果确实需要FULL-TRUST,请确保您的网络应用程序在 FULL-TRUST 中运行。

3。)拿大会,尝试在其他asp.net应用程序中使用它,在单独的服务器上运行测试应用程序。这可能有助于您诊断问题。还尝试在同一服务器上运行测试asp.net应用程序,但是在单独的应用程序池中。

4.确保应用程序的 IIS网站在具有必要安全权限的用户帐户下运行。尝试在Administratotr下运行应用程序作为用户。

EDIT-1

5.)同时检查程序集版本是否与web.config中提到的相同。如果版本不匹配,那么您可以在web.config中执行 AssemblyBinding Redirection

6。)同时尝试在GAC中对装配进行注册,看看它是否正确加载。

EDIT-2

7。)尝试在服务器上重新配置ASP.NET支持,或者框架运行时重新设置可能会有所帮助。这可能不是一个确定的解决方案,但考虑到问题的情况,我们可能想尝试各种解决方案。

8。)确保您没有错过任何 Windows服务器平台的重要更新。

答案 3 :(得分:0)

我试着给你一些想法 - 如果我在你的位置,我会怎么做。

首先,我会在你提出问题的某些日子之前仔细看看MonoTorrent.dll,今天我再看一遍。我找到了加载dll的函数。我的第一个意见是某些事情与权限有关。

我希望你有权访问服务器 - 对吧?

我的第一步是:

确保您的monotorrent.dll实际拥有对bin目录的正确权限,对于Read,并由您的asp.net应用程序执行。有时候一个dll的副本,没有得到目录权限,但运出了自己的权限。要检查您的dll是否具有与其余dll不同的权限,只需右键单击并查看属性|安全性,然后转到bin目录并执行相同操作,并比较安全权限。如果它们不同,则再次应用目录权限并确保目录继承的dll。

我的第二步

从sysinternals下载ProcessMonitor

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

运行ProcessMonitor并尝试重新创建错误,停止并分析以查看dll获取拒绝运行权限的位置和原因。 使用ProcessMonitor,您甚至可以查看是否有任何无法找到的dll!

我检查了MonoTorrent dll,但我没有发现任何异常。他有kerner32.dll调用,并使用不安全的代码运行,没什么特别的。

所以,如果你做了两个步骤并给我一些反馈,也许我可以走得更远。 (如果没有你解决,你发现了什么)

答案 4 :(得分:0)

我会建议定期维护,可能在一周内在星期天晚上等一次,以便跟进,

  1. 删除所有临时文件
  2. 删除所有ASP.NET IIS临时文件
  3. 重新启动服务器
  4. 问题是,ASP.NET Web应用程序导致大量临时文件留在磁盘中,因为动态编译正则表达式,seriliazation程序集等,这些临时内容永远不会被删除,越来越多的垃圾开始被收集到临时位置,ASP.NET变得越来越慢,并且在磁盘和内存碎片整理达到非常高的位置时出现了一个问题,事情开始失败。

    没有人喜欢每周重启服务器一次,但我记得我们别无选择,在ASP.NET 1.1中我们每天重启后都有稳定的系统,在ASP.NET 2.0以后,我们很高兴重启计划在每周一次。

答案 5 :(得分:0)

我发现了这个问题,我尽我所能,比如清除临时文件,重启服务器,删除和添加引用,我也重建了解决方案。但是我无法解决这个问题。最后,我将我的实体类(几乎需要序列化)移动到我已添加到项目中的新文件夹,然后解决了这个问题。

这种方法对我有用。

答案 6 :(得分:0)

服务器时区是否与您的时区不同?我在部署资源文件时遇到了这个问题,编译时间是将来的,因此无法加载。

答案 7 :(得分:-2)

我猜你有很多开放但没有关闭的连接。我的意思是连接不会返回池中。看起来没问题,当你启动应用程序时,但是经过一段时间后,池中只有几个插槽可用,而且速度很慢。另一件事 - 非封闭连接可能会将DLL保留在内存中,而不允许释放处理程序。尝试调试对象销毁。

答案 8 :(得分:-2)

我知道这很简单,但我曾经遇到过这个问题,因为我有一个包含

的Web应用程序项目
    References

文件夹和我刚将我的文件复制到

    Bin

文件夹,在项目属性窗口中的任何.net Web应用程序中,参考路径选项卡可用,默认情况下不应包含任何内容。选中此选项以及项目属性窗口中的构建标签,其中输出路径 bin \ <相同/ p>