我昨晚部署了一个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应用程序程序集的名称。
答案 0 :(得分:4)
在这种情况下会发生这种情况:
ASP.NET应用程序创建一个后台线程,该线程抛出未捕获的异常。看起来ASP.NET捕获异常并希望将其记录到事件日志中。为此,它将此异常从Web应用程序的应用程序域发送到其自己的应用程序域(w3wp进程的默认属性)。这需要对异常进行序列化/反序列化。
如果异常是自定义异常(即由Web应用程序定义),则无法在ASP.NET的主应用程序域中反序列化,因为定义异常的程序集通常位于Web应用程序的bin目录中,而不是w3wp .exe是(c:\ windows \ system32 \ inetsrv)。这会导致序列化异常并导致w3wp崩溃。
有一些方法可以解决问题(以非常主观的方式 - 优先顺序):
注意:
答案 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。在这一点上,我所得到的只是随机猜测。
你可能也想输入你的截图文字,这样你就会得到一些Google的爱....
答案 2 :(得分:1)
以下是您可以尝试的一些内容..
1。)刷新ASP.Net Temp目录。 重新启动IIS 和回收应用程序池。
2。)如果确实需要FULL-TRUST,请确保您的网络应用程序在 FULL-TRUST 中运行。
3。)拿大会,尝试在其他asp.net应用程序中使用它,在单独的服务器上运行测试应用程序。这可能有助于您诊断问题。还尝试在同一服务器上运行测试asp.net应用程序,但是在单独的应用程序池中。
4.确保应用程序的 IIS网站在具有必要安全权限的用户帐户下运行。尝试在Administratotr下运行应用程序作为用户。
5.)同时检查程序集版本是否与web.config中提到的相同。如果版本不匹配,那么您可以在web.config中执行 AssemblyBinding Redirection 。
6。)同时尝试在GAC中对装配进行注册,看看它是否正确加载。
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)
我会建议定期维护,可能在一周内在星期天晚上等一次,以便跟进,
问题是,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>