【问题标题】:ASP.NET web application can't find an assemblyASP.NET Web 应用程序找不到程序集
【发布时间】:2011-02-02 06:46:29
【问题描述】:

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

我检查了事件查看器,它充满了这些错误:

发生未处理的异常,进程终止。

异常:System.Runtime.Serialization.SerializationException

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

我很困惑,因为当我部署它时它运行良好(MonoTorrent 需要从跟踪器中检索某个 torrent 的播种机/leechers 的数量 - 这工作正常),但它不再工作并且每当代码涉及到使用 MonoTorrent 的工作进程会崩溃。

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


2010 年 6 月 4 日更新:我将 MonoTorrent 源代码与我的 Web 应用程序的其余部分一起编译,但它在使用 MonoTorrent 时仍然崩溃。但是,它现在说它是Unable to find assembly 'OpenPeer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null。这里,OpenPeer 是 Web 应用程序程序集的名称。

【问题讨论】:

  • 100% 确定您部署了正确版本的程序集?
  • 是的,将鼠标悬停在程序集上表示它的版本是 0.80.0.0
  • 应用程序是否部署在标记为应用程序的 IIS 虚拟目录/文件夹中? bin 文件夹是否位于 Web 应用程序的根目录中?
  • @DaveB 是的,bin 文件夹位于应用程序的根目录中。我在那里有其他程序集,比如 Recaptcha 库和 Mysql.Data.dll 加载正常。我不确定虚拟目录的东西,我该如何检查?
  • 也许这个问题的答案确实对您的问题有所启发:stackoverflow.com/questions/747149/unable-to-find-assembly

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


【解决方案1】:

这可能发生在以下情况:

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

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

有可能解决问题的方法(按照 - 非常主观的 - 偏好顺序):

  1. 将缺少的 DLL 复制到 c:\windows\system32\inetsrv
  2. 在 GAC 中安装缺少的 DLL
  3. 消除异常的原因(做起来比说起来难,就像我们用法语说的那样)
  4. 自己从后台线程捕获所有异常并自己进行日志记录。

注意事项:

  • 如果使用 WCF 并且未捕获的异常是 FaultException,WCF 会吞下它并且不会崩溃
  • 如果未捕获的异常在Web请求的线程中,有黄屏死机,不是这个序列化异常
  • 这似乎真的是 ASP.NET 中的一个错误
  • 以上实际上是我昨天对这个问题的调查总结,只是一个理论。我测试了修复 1 和 4,以及使用 FaultException。

【讨论】:

    【解决方案2】:

    我知道这很简单,但我曾经遇到过这个问题,这是因为我有一个 Web 应用程序项目,其中包含

        References
    

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

        Bin
    

    文件夹,在项目属性窗口中的任何.net Web应用程序中,都有一个参考路径选项卡可用,默认情况下不应包含任何内容。在项目属性窗口中勾选这个选项和Build tab,其中Output pathbin\一样

    【讨论】:

      【解决方案3】:

      这里有一些你可以尝试的东西..

      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 重定向

      6.) 还可以尝试在 GAC 中注册程序集,看看它是否正确加载。

      EDIT-2

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

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

      【讨论】:

      • 我已经尝试过 1 和 2。我在这里只有一台服务器可以使用,但我尝试删除应用程序池和网站并重新添加两者。对于 4,我已经尝试将其作为 LOCAL SYSTEM 运行,但没有帮助。
      • 5 可能与它有关,因为在 web.config 中根本没有提到 MonoTorrent。我自己添加的,但我没有包含任何版本号。我只是将<add assembly="MonoTorrent"/> 放在<assemblies> 标签下。这会影响什么吗?
      • 另外,我不能做 6,因为 MonoTorrent.dll 不是强命名的。
      • 对于6,您可以使用sn.exe工具自己进行强命名。
      【解决方案4】:

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

      【讨论】:

      • 服务器时区是相同的,但由于夏令时(呃)我将鼠标悬停在服务器上的 MonoTorrent.dll 上,但创建时间在服务器当前时间之前。
      【解决方案5】:

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

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

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

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

      1. 我注意到您正在运行 x64...MonoTorrent 可能是require x86
      2. 您是否仔细检查过该目录是一个 IIS 应用程序,并且配置为正确的 ASP.NET 版本?
      3. 此服务器上是否有其他使用 MonoTorrent 的应用程序?也许是 WCF 服务之类的?我不确定序列化发生在哪里......
      4. 尝试挂钩 AssemblyResolve event 并手动加载它。
      5. 你能在开发机器上重现吗?如果没有,可能是 FX 安装错误。卸载并重新安装。
      6. 重新启动、回收或停止/启动 AppPool 是否会暂时解决问题,或导致问题出现?

      您可能还想输入您的屏幕截图文本,以便获得 Google 的喜爱....

      【讨论】:

      • 部分融​​合日志显示成功:pastebin.com/jWfuiWRD,其他显示失败,但不给出任何原因:pastebin.com/DMG4mJGW
      • 是的,我知道我将 webapp 作为 SYSTEM 帐户运行,这是一个简短的实验,看看它是否能解决任何问题,但它没有。
      • @Charlie - 你在运行 IIS7 吗?您是否正在创建一个单独的 AppDomain?
      • 我使用的是 IIS6,这个 Web 应用程序在它自己的 AppDomain 中
      • 另外,我的开发机器和服务器都运行 x64。这是唯一使用 MonoTorrent 的应用程序。不过我会检查其他内容。
      【解决方案6】:

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

      这个方法适合我。

      【讨论】:

        【解决方案7】:

        我建议在星期天晚上等设置定期维护一次,以供后续使用,

        1. 删除所有临时文件
        2. 删除所有 ASP.NET IIS 临时文件
        3. 重启服务器

        问题是,ASP.NET Web 应用程序会导致大量临时文件留在磁盘中,因为正则表达式的动态编译、序列化程序集等,这些临时文件永远不会被删除,并且越来越多的垃圾开始被收集到临时位置,ASP.NET 变得越来越慢,当磁盘和内存碎片整理达到非常高的点时,事情开始失败。

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

        【讨论】:

        • 我认为每周重启服务器并清除所有临时文件等太多了。我相信你有内存韭菜,或者你做了太多更新 - 所以你的系统需要一次又一次地制作 asp.net 系统,或者你的其他用户创建有问题的 aspx 页面。我的系统运行持续了 40 多天,池从不回收,可用内存很好,速度超级快,一切都运行得非常快。
        【解决方案8】:

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

        【讨论】:

        • 这与提出的问题无关。您描述的情况不是正在发生的情况。
        • 如果您如此确定,那么我必须道歉。当同步线程不正确时,我也有类似的行为。
        【解决方案9】:

        我试着给你一些想法——如果我在你的位置上我会做什么。

        首先,在您提出问题的前几天,我仔细查看了 MonoTorrent.dll,今天我再次查看。我找到了加载 dll 的函数。我的第一个观点是,与权限有关。

        我希望您可以访问服务器 - 对吧?

        我的第一步是:

        确保您的 monotorrent.dll 实际上对 bin 目录具有正确的权限,以供您的 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 调用,并使用不安全的代码运行,没什么特别的。

        因此,如果您执行这两个步骤并给我一些反馈,也许我可以走得更远。 (如果没有由你解决和你发现的)

        【讨论】:

          猜你喜欢
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 2022-01-16
          • 2016-11-13
          • 2015-07-19
          • 1970-01-01
          相关资源
          最近更新 更多