Error with views using Mono and MVC 4

AJ. picture AJ. · Mar 3, 2014 · Viewed 10.1k times · Source

I am attempting to get started with the Mono framework and have run into numerous issues, the latest of which has me exasperated. I have looked all over for a solution and haven't been able to figure this out.

Environment
Ubuntu 12.04 (on Hyper-V virtual machine)
Visual Studio 2012 (fully updated)
ASP.NET MVC 4
.NET Framework 4
Mono 3.4.0 (pulled and compiled directly from git using make)
XSP Mono.WebServer2 0.2.0.0 (also from git)

My mono installation follows the instructions from this answer almost exactly. What happens is this:

  1. I create a new MVC 4 project in VS 2012 using the default options.
  2. I publish said application without changing any referenced DLL's "copy local" setting using a File System publish profile.
  3. Then, FTP the files to the Ubuntu VM and copy them all to the websites home folder (/var/www/mvc, which I configured as the default for Apache2).
  4. cd /var/www/mvc in a bash prompt and run xsp4.
  5. Hit the server/port and receive this error:

System.InvalidOperationException
The view 'index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml

Description: HTTP 500. Error processing request.
Details: Non-web exception. Exception origin (name of application or object): System.Web.Mvc.
Exception stack trace:

at System.Web.Mvc.ViewResult.FindView(System.Web.Mvc.ControllerContext context) [0x00000] in <filename unknown>:0
at System.Web.Mvc.ViewResultBase.ExecuteResult(System.Web.Mvc.ControllerContext context) [0x00000] in <filename unknown>:0
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ActionResult actionResult) in <filename unknown>:0
at System.Web.Mvc.ControllerActionInvoker+<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17 () [0x00000] in <filename unknown>:0
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, System.Web.Mvc.ResultExecutingContext preContext, System.Func`1 continuation) [0x00000] in <filename unknown>:0

Version Information: 3.4.0 (master/830c517 Fri Feb 28 16:03:26 CST 2014); ASP.NET Version: 4.0.30319.17020

I've attempted various compilation combinations (targeting 4.5 instead 4.0, using MVC 3 instead of 4), removed WebPages.OAuth.dll, copy-localed various reference combinations, and exhaustive web searches...all to no avail. Is it something to do with my Mono version? XSP? Is there a definitive solution for this issue?

UPDATE
If I target .NET Framework 4.5 with an MVC 4 project, the error changes to this:

System.IO.FileNotFoundException
Could not load file or assembly 'log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a' or one of its dependencies.
Description: HTTP 500. Error processing request.
Details: Non-web exception. Exception origin (name of application or object): DotNetOpenAuth.Core.
Exception stack trace:

at DotNetOpenAuth.Logger.Create(System.String name) [0x00000] in <filename unknown>:0
at DotNetOpenAuth.Logger.CreateWithBanner(System.String name) [0x00000] in <filename unknown>:0
at DotNetOpenAuth.Logger..cctor() [0x00000] in <filename unknown>:0

I am not using log4net.

Answer

AJ. picture AJ. · Mar 6, 2014

After days of research, I've learned several things, first and foremost being that Mono 3.x is not supported on Ubuntu 12.04.

So, MVC 4 is out of the question on that OS (and most other Linux OS's that I messed with). For future reference, I was finally able to get MVC 3 working on Ubuntu 12.04 doing the following:

  1. Install Ubuntu 12.04 from the ISO using a Hyper-V VM (I will happily give details on that setup if anyone wants them).
  2. Install all Ubuntu updates (restart required).
  3. Open a terminal window (Ctrl+Alt+T).
  4. (Optional) Install XRDP, which allows remote desktop connections to Ubuntu VM. I can't stand the default terminal server window for Hyper-V with *nix systems, as the keyboard/mouse mappings are goofy.

    sudo apt-get install xrdp

  5. (Optional) Use ifconfig at the terminal to get the VMs IP address which you can use for remote desktop connections.

  6. Install Apache2.

    sudo apt-get install apache2

  7. Install Apache2 threaded dev (required for XSP4, installed below).

    sudo apt-get install apache2-threaded-dev

  8. Install Mono-runtime package.

    sudo apt-get install mono-runtime

  9. Install Mono-complete package.

    sudo apt-get install mono-complete

  10. Install XSP4 (this is a very light-weight web server you can use for development).

    sudo apt-get install mono-xsp4

  11. Install ASP.NET examples package. Apparently XSP4 doesn't install everything it needs, but requires some set of ASP.NET components be installed separately in order to work.

    sudo apt-get install asp.net-examples

After this, you can set up a folder for your MVC 3 site in /var/www and bin deploy your site. It is very important that certain assemblies are copied into your site folder to make it work, namely:

  • System.Web.Helpers
  • System.Web.Mvc
  • System.Web.Razor
  • System.Web.Routing
  • System.Web.WebPages
  • System.Web.WebPages.Razor
  • System.Web.WebPages.Deployment

So make sure these are set to "copy local" or figure out where the right versions are on your Windows system and manually copy them to your site folder. Then, you can configure Apache and test your site using XSP4 (again, I'll give details if requested):

cd /var/www/sitefolder/
xsp4

Which will show you something like this:

xsp4
Listening on address: 0.0.0.0
Root directory: /var/www/sitefolder
Listening on port: 8080 (non-secure)
Hit Return to stop the server.

And you can hit the site in a browser on the VM with localhost:8080.

Hope this helps someone in the future.