Mono+Jexus部署MVC的各种坑

Posted 永久离线

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mono+Jexus部署MVC的各种坑相关的知识,希望对你有一定的参考价值。

  别人提到的这里不赘述,只说查了好久才知道的。

1号坑:System.IO.FileNotFoundException Could not find file "roslyn\csc.exe".
详细信息如下:

System.IO.FileNotFoundException
Could not find file "/var/www/defalut/bin\roslyn\csc.exe".

Description: HTTP 500.Error processing request.

Details: Non-web exception. Exception origin (name of application or object): mscorlib.
Exception stack trace:
  at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean anonymous, FileOptions options) <0x41aaab70 + 0x006e7> in     <filename unknown>:0 
  at System.IO.FileStream..ctor (System.String path, FileMode mode, FileAccess access, FileShare share) <0x41bba470 + 0x00053> in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.IO.FileStream:.ctor (string,System.IO.FileMode,System.IO.FileAccess,System.IO.FileShare)
  at System.IO.File.OpenRead (System.String path) <0x41bc4b50 + 0x0003f> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.get_CompilerName () <0x41e0fb40 + 0x00086> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x41e1d600 + 0x005ce> in     <filename unknown>:0 

只贴其中的一部分,但是大致一看也能看出路径有问题,问题的原因:

http://www.mono-project.com/docs/advanced/iomap/

Mono官方网站给出的解释及解决方案如下:

The Problem

Windows developers are used to a case-insensitive file system, which means that they might create a file called “mydata” in one place, and try to access it somewhere else as “MyData” or as “MYDATA”. This breaks on most Unix setups because Unix is case sensitive[1].

Another problem is that developers sometimes hardcode the directory separator character in their source code (“\”) instead of using Path.DirectorySeparator and using Path.Combine for combining this paths. This is a problem because “\” is a valid file name components on Unix. This means that if an application hardcodes for example “Logs\access_log”, in Unix this will not store the contents in the “Logs” directory as the file “access_log”. Instead, it will store the results in a file called “Logs\access_log”.

Only a few applications cope with drive letters, but they might still pose a problem as the colon is a valid filename in Unix, which means that “A:\file” is a valid filename in the current directory.

Although .NET provides the tools to write code that is portable, in practice, they do not use these features (the exception is Path.Combine, which some people use, as it is genuinely useful on its own).

The Usual Solution

When moving applications from Windows to Linux, it is always necessary to run the application, run its test suite, and validate that the application works as intended. With the path problems described above, the process above included a number of iterations to fix the assumptions made by programmers about the file system.

This process could be time consuming, because identifying where the mistakes were made could take some time, the program might fail with FileNotFound exceptions (when referencing files that were not there), data would show up empty (listing contents of a directory that had nothing, as all the data went elsewhere) but it was doable.

This process works as long as you have the source code to all the components that you are porting, but if you were using a third-party library that you had no source code for, you would not be able to fix the problems.

The New Solution

Mono now has a portability layer into Mono that will address those problems without requiring changes to your code. This will remove a large component of the porting cycle as a whole class of obnoxious problems are gone.

The new portability framework is enabled by setting the environment variable MONO_IOMAP (which we will likely rename to something shorter) to one of the following values:

  • case: makes all file system access case insensitive.
  • drive: strips drive name from pathnames.
  • all: enables both case and drive.

In addition, if any of those options are enabled, the directory separator mapping is also turned on. So this basically means that you have to type this, or include this in your script that launches your application:

   $ export MONO_IOMAP=all
   $ mono myapp.exe

For ASP.NET applications hosted with mod_mono, you can add the following directive to your Apache configuration file:

 MonoSetEnv MONO_IOMAP=all

This new feature appeared in Mono 1.1.18 and is available in all new Mono 1.2.x versions as well.

The downside is that Mono will have to do some extra work when coping with your file system, to search for case insensitive file names. So if your application is still a portable application, you will be much better off without this switch.

[1] Some Linux file systems are case insensitive, and some folks have used a combination of hacks, including doing loopback CIFS mounts to get case sensitivity issues out of the way; OS X does not have this particular problem, but it still has the others.

2号坑:System.InvalidOperationException  Process has not been started.

详细信息如下:

Description: HTTP 500.Error processing request.
Details: Non-web exception. Exception origin (name of application or object): System.
Exception stack trace:
  at System.Diagnostics.Process.get_ExitCode () <0x414b69b0 + 0x000a3> in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
  at System.CodeDom.Compiler.Executor.InternalExecWaitWithCapture (System.String cmd, System.String currentDir, System.CodeDom.Compiler.TempFileCollection tempFiles, System.String& outputName, System.String& errorName) <0x414b3ec0 + 0x00403> in <filename unknown>:0 
  at System.CodeDom.Compiler.Executor.ExecWaitWithCapture (IntPtr userToken, System.String cmd, System.String currentDir, System.CodeDom.Compiler.TempFileCollection tempFiles, System.String& outputName, System.String& errorName) <0x414b3c00 + 0x00057> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.Compile (System.CodeDom.Compiler.CompilerParameters options, System.String compilerFullPath, System.String arguments, System.String& outputFile, System.Int32& nativeReturnValue) <0x414b37e0 + 0x0010b> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x414b03e0 + 0x005ef> in <filename unknown>:0 
  at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x414b0250 + 0x000c7> in <filename unknown>:0 
  at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromFile (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) <0x414b00b0 + 0x00049> in <filename unknown>:0 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath, System.CodeDom.Compiler.CompilerParameters options) <0x4149bd40 + 0x00979> in <filename unknown>:0 
  at System.Web.Compilation.AssemblyBuilder.BuildAssembly (System.Web.VirtualPath virtualPath) <0x4149bd00 + 0x00023> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GenerateAssembly (System.Web.Compilation.AssemblyBuilder abuilder, System.Web.Compilation.BuildProviderGroup group, System.Web.VirtualPath vp, Boolean debug) <0x414913e0 + 0x0097b> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.BuildInner (System.Web.VirtualPath vp, Boolean debug) <0x41444aa0 + 0x0050b> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.Build (System.Web.VirtualPath vp) <0x41444520 + 0x000ff> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GetCompiledType (System.Web.VirtualPath virtualPath) <0x41443e20 + 0x0008f> in <filename unknown>:0 
  at System.Web.Compilation.BuildManager.GetCompiledType (System.String virtualPath) <0x41443a50 + 0x00017> in <filename unknown>:0 
  at System.Web.HttpApplicationFactory.InitType (System.Web.HttpContext context) <0x413dd430 + 0x003f3> in <filename unknown>:0 

 

 

 

待续···

 

以上是关于Mono+Jexus部署MVC的各种坑的主要内容,如果未能解决你的问题,请参考以下文章

通过Jexus 部署 dotnetcore

通过Jexus 部署 dotnetcore版本MusicStore 示例程序

Centos下安装Jexus.net,上传部署运行asp.net项目

Cactus在jexus上安装

Jexus~mono中使用StackExchange.redis的问题

centos7+mono4.2.3.4+jexus5.8.1跨平台起飞