Как успешно разместить ASP.NET MVC4 RC на Mono 2.10.8

Я пытаюсь разместить проект ASP.NET MVC4 RC поверх Mono 2.10.8.1. При первом обращении к приложению я получаю следующее исключение:

Missing method System.Web.Security.FormsAuthentication::get_IsEnabled() in assembly /usr/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll, referenced in assembly /tmp/root-temp-aspnet-0/eaee30a1/assembly/shadow/5cf10065/40974e7d_1c664e18_00000001/System.Web.Http.WebHost.dll

В соответствии с http://www.mono-project.com/Compatibility это должно быть реализовано в Mono 2.10.8. Microsoft перечисляет это свойство как .NET Framework 4.0: http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.isenabled.aspx

Есть ли какая-нибудь работа, или просто невозможно разместить MVC4 на Mono в это время?

Я должен заметить, что я получаю эту проблему как при использовании XSP4, так и mod_mono на Apache2.

Моно версия:

Mono JIT compiler version 2.10.8.1 (Debian 2.10.8.1-1~dhx1~lucid1)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       altstack
        Notifications: epoll
        Architecture:  x86
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC and Parallel Mark)

Ответ 1

TL/DR: запуск MVC4 в Mono по-прежнему не рекомендуется, запустите MVC3.

Длинная история: в то время, когда был выпущен Mono 2.10.x, Microsoft не полностью выпустила стек ASP.NET как открытый источник (Razor был одним из компонентов, который все еще был закрытым исходным кодом).

Недавно Microsoft наконец-то открыла полный стек, а Mono включил его в свое дерево, однако это произошло только в мастер-ветке (и в нее также включены только предварительные версии Mono 2.11.x). Кроме того, асинхронные API еще не реализованы в Mono (и MVC4 зависит от них), поэтому лучшим выбором для вас является использование MVC3 на данный момент с версией Mono 3.0.1.

Еще более длинная история: http://tirania.org/blog/archive/2012/Mar-28.html

Ответ 2

Теперь это возможно, и он почти прост в текущей моно-релизе и с использованием NuGet. Тот факт, что MS положил материал MVC4 на NuGet, помогает. Я разместил рабочие шаблоны для .Net 4 и .Net 4.5 на github https://github.com/chrisfcarroll/AspNetTemplatesForMono. Есть пара исправлений, но они адресованы в заметках.

Ответ 3

Вам нужно скомпилировать новую форму XSP из источников

git clone git://github.com/mono/xsp.git
cd xsp
./autogen.sh --prefix=/opt
make
sudo make install

Эта версия нуждается в достаточном разрешении для запуска, sudo..., иначе вы получите сообщение System.IO.FileNotFoundException.

Затем добавьте эти строки в файл web.config

<system.web> 
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />        
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />        
      </assemblies>
    </compilation>

Чтобы исключить исключение CS0234: The type or namespace name Helpers does not exist in the namespace System.Web..

Затем удалите эти сборки из папки bin (если они скопированы из машины Windows)

Microsoft.Web.Infrastructure.dll
System.Net.Http.dll
System.Net.Http.Formatting.dll
System.Web.Http.dll
System.Web.Http.WebHost.dll

Это приведет к удалению исключения Missing method System.Web.Security.FormsAuthentication::get_IsEnabled() и многих других исключений could not load type xyz.

Ответ 5

Удалите ссылку на System.Web.Http и System.Web.Http.Host, если они вам не нужны (библиотека WebApi). Возможно, вам придется удалить WebApiConfig.cs в папку App_Start и ссылки в Global.asax. Но после этого ваш проект будет работать без каких-либо других проблем.