【问题标题】:System.InvalidOperationException compiling ASP.NET app on MonoSystem.InvalidOperationException 在 Mono 上编译 ASP.NET 应用程序
【发布时间】:2010-03-29 13:50:38
【问题描述】:

这是我在 Mono 中启动 ASP.NET 应用程序时遇到的错误:

System.InvalidOperationException: The process must exit before getting the requested information.
  at System.Diagnostics.Process.get_ExitCode () [0x00044] in /usr/src/mono-2.6.3/mcs/class/System/System.Diagnostics/Process.cs:149 
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
  at Mono.CSharp.CSharpCodeCompiler.CompileFromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) [0x001ee] in /usr/src/mono-2.6.3/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs:267 
  at Mono.CSharp.CSharpCodeCompiler.CompileAssemblyFromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) [0x00011] in /usr/src/mono-2.6.3/mcs/class/System/Microsoft.CSharp/CSharpCodeCompiler.cs:156 
  at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromFile (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) [0x00014] in /usr/src/mono-2.6.3/mcs/class/System/System.CodeDom.Compiler/CodeDomProvider.cs:119 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath, System.CodeDom.Compiler.CompilerParameters options) [0x0022f] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/AssemblyBuilder.cs:804 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath) [0x00000] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/AssemblyBuilder.cs:730 
  at System.Web.Compilation.BuildManager.GenerateAssembly (System.Web.Compilation.AssemblyBuilder abuilder, System.Web.Compilation.BuildProviderGroup group, System.Web.VirtualPath vp, Boolean debug) [0x00254] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/BuildManager.cs:624 
  at System.Web.Compilation.BuildManager.BuildInner (System.Web.VirtualPath vp, Boolean debug) [0x0011c] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/BuildManager.cs:411 
  at System.Web.Compilation.BuildManager.Build (System.Web.VirtualPath vp) [0x00050] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/BuildManager.cs:356 
  at System.Web.Compilation.BuildManager.GetCompiledType (System.Web.VirtualPath virtualPath) [0x0003a] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/BuildManager.cs:803 
  at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath (System.Web.VirtualPath virtualPath, System.Type requiredBaseType) [0x0000c] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.Compilation/BuildManager.cs:500 
  at System.Web.UI.PageParser.GetCompiledPageInstance (System.String virtualPath, System.String inputFile, System.Web.HttpContext context) [0x0001c] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.UI/PageParser.cs:161 
  at System.Web.UI.PageHandlerFactory.GetHandler (System.Web.HttpContext context, System.String requestType, System.String url, System.String path) [0x00000] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web.UI/PageHandlerFactory.cs:45 
  at System.Web.HttpApplication.GetHandler (System.Web.HttpContext context, System.String url, Boolean ignoreContextHandler) [0x00055] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web/HttpApplication.cs:1643 
  at System.Web.HttpApplication.GetHandler (System.Web.HttpContext context, System.String url) [0x00000] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web/HttpApplication.cs:1624 
  at System.Web.HttpApplication+<Pipeline>c__Iterator2.MoveNext () [0x0075f] in /usr/src/mono-2.6.3/mcs/class/System.Web/System.Web/HttpApplication.cs:1259 

我查看了stacktrace指示的源代码,即:CSharpCodeCompiler.cs:267

mcs.WaitForExit();
result.NativeCompilerReturnValue = mcs.ExitCode; //this throws the exception

我不知道这是 Mono 中的一个错误,还是我的应用程序正在做不应该做的事情。

一个简单的“Hello World”应用程序表明 Mono 已正确安装并正常工作,只是我的应用程序导致此异常被抛出。

希望一些开明的人对此问题有更多了解

我在 CentOS 5.4 服务器上运行 Apache + mod_mono 2.6.3

简单的“Hello World”和我的应用程序之间的区别似乎在于,Global.asax 的 Application_Start() 中有大量的东西 >。有打开(和关闭)的 TCP 套接字,产生了数十个新线程(大约 80 个),并且启动和关闭了各种服务。在普通的 Windows + IIS 服务器中,应用程序最多需要 30 秒才能启动。为什么这会对 Mono 产生影响?

编辑:

有趣的是,规避此问题的一种方法是将所有代码从 Application_Start 移动到一个单独的异步进程中:

void Application_Start()
{
 var t = new System.Threading.Thread(new ThreadStart(this.Async_Application_Start));
 t.Start();
}

void Async_Application_Start()
{
   ... Lots of stuff going on here..

   log('Async Application Start is done!'); // this actually gets logged, so the code DOES execute and end
}

【问题讨论】:

  • 你使用什么网络服务器,你能提供一些关于你的网络应用的信息吗?

标签: asp.net mono


【解决方案1】:

尝试查看this的帖子。

【讨论】:

  • 我以前看过那个帖子;唉,那里接受的答案建议在使用 ExitCode 之前添加 WaitForExit() ;这正是 Mono 代码正在做的事情:-(
  • 是的,但让我们首先尝试在 webapp 代码中而不是单声道中查找错误。既然您说 Global.asax 中有很多东西:您是否在那里创建了一些新流程?你能在Application_Start()中一步步调试你的webapp吗?
  • 我无法从 IDE 调试应用程序。我正在使用 VS2010 -> 发布 -> 通过 Samba 手动复制文件。是的,大约有 80 个新进程启动。跳过 Application_Start() 工作正常,但我不能逐行删除它,因为进程是相互关联的并且相互依赖才能正常运行。除了这个之外,没有其他异常抛出(我记录了每个异常)。
  • 在这些进程之间 - 你不能遇到与帖子中提到的 WaitForExit() 相关的相同问题吗?您可以尝试使用 MonoDevelop 调试您的应用程序吗?
  • 好吧,堆栈跟踪提到了对 System.Web.UI.PageParser.GetCompiledPageInstance() 的调用,这让我相信这是从编译和服务请求的进程中抛出的,而不是从衍生的进程中抛出的.我会尝试设置 MonoDevelop 看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 2015-07-25
  • 2010-11-30
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多