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

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

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

例外:System.Runtime.Serialization.SerializationException

信息:无法找到程序集“MonoTorrent,版本=0.80.0.0,文化=中性,PublicKeyToken=null”

我很困惑,因为当我部署它时它工作得很好(MonoTorrent 需要从跟踪器中检索某个 torrent 的播种者/下载者的数量 - 这工作正常),但它不再工作,并且每当使用 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 应用程序程序集的名称。

没有正确的解决方案

其他提示

在这些情况下可能会发生这种情况:

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。

尝试 清除 ASP.NET 临时文件. 。它之前为我解决了一些奇怪的问题。

否则, 融合测井 可能会有所启发。

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

我很确定事件查看器应该显示应用程序 ID:LM/W3SVC/#/ROOT(如果它也是默认的 AppDomain)。目前,我所能得到的只是随机猜测。

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

你可能也想输入你的屏幕截图文本,这样你就会得到一些谷歌的喜爱......

下面有一些事情你可以尝试..

1)的冲洗ASP.Net Temp目录即可。的重新启动IIS 和<强>再循环池的应用

2)确保你的web应用程序运行的 FULL-TRUST 如果真的需要完全信任的。

3。)采取大会,尝试在其他asp.net应用程序和使用它的运行一个单独的服务器在测试应用程序。这可以帮助你诊断问题。也可以尝试在同一台服务器上,但在单独的应用程序池中运行测试asp.net应用程序。

4)确保在 IIS应用程序的网站的用户帐户下运行提供必要的安全特权时。尝试Administratotr下运行的应用程序作为用户。

EDIT-1

5)。另外检查组件版本相同web.config中提及。如果有一个版本不匹配,那么你可以做的 AssemblyBinding重定向在web.config中。

6)。另外尝试GAC registaering大会,看看它是否正确加载。

EDIT-2

7)。尝试服务器或也许框架运行时重新设置可以有助于在reconfigring ASP.NET支持。这可能不是一个肯定出手解决方案,但看问题的条件,我们可能会想尝试不同的解决方案。

8)确保您不会错过你的windows服务器的任何关键更新的平台。

我尽量给你一些想法 - 我做什么,如果我是你的位置

首先,我把MonoTorrent.dll的长时间看前几天,你让你的问题,我今天再看看它。我发现并加载DLL中的函数。我的第一个观点是,一些具有相应的权限。

我希望你可以访问服务器 - 右

我的第一个步骤是:

请确保您的monotorrent.dll实际工作有正确的权限bin目录,用于读取,并通过你的asp.net应用程序执行。有些时候,一个DLL的副本,没有得到目录权限的击打马车出了自己的权限。要检查您的DLL具有与众不同的权限,只需右键点击并查看属性|安全性,然后转到bin目录,做同样的,并且比较安全权限。如果它们是不同的,然后再次申请目录的权限,并确保由目录继承的dll。

我的第二步骤

这Sysinternals的下载的ProcessMonitor

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

运行的ProcessMonitor,试着重新错误后,停止和分析,看看为什么该DLL得到拒绝的权限来运行。 随着的ProcessMonitor,你甚至可以看到,如果有,可以没有发现任何的dll!

我检查MonoTorrent DLL和我没有发现什么异常。他有kerner32.dll通话,并使用不安全的代码运行,确定没什么所以有关特殊。

所以,如果你这样做2步,给我一些反馈,也许我可以走得更远。 (如果没有被你解决,你会发现什么的)

我建议设置定期维护,可能每周一次,周日晚上等,以便进行后续维护,

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

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

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

我已经发现了这个问题,我必须做的所有事情,我可以,如透明的临时文件,重新启动服务器,删除和添加引用,我也重新生成解决方案。但是我不能解决这个问题。最后,我将我的实体类(几乎他们需要序列化)到新的文件夹,我已经加入到该项目,那么这个问题就解决了。

本方法是用于我的工作。

时的比你的时区服务器的时区不同?我已经部署的资源文件的时候有这个问题,编译时间是在未来,这样他们就无法加载。

我的猜测,你有足够的开放,但没有关闭连接。我指的是连接不返回到池中。它看起来不错,当你启动应用程序,但一段时间后,只有在游泳池几个可用的插座,它会缓慢。另一件事 - 非封闭式连接可能会保持在DLL内存,不允许以释放处理器。尝试调试对象的破坏。

我知道这很简单,但一旦和itwas因为我有包含

Web应用程序的项目,我有这个问题
    References

文件夹和我只是复制我的文件到

    Bin

文件夹,在项目属性窗口任何.NET Web应用程序,一个引用路径标签可在默认情况下应该没有在其上包括。检查此选项,并且还<强>构建标签在的项目属性窗口其中的输出路径是作为相同的仓\

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top