Ошибка при просмотре с использованием Mono и MVC 4
Я пытаюсь начать работу с платформой Mono и столкнулся с многочисленными проблемами, последний из которых вызвал у меня раздражение. Я все искал решение и не смог понять это.
Среда
Ubuntu 12.04 (на виртуальной машине Hyper-V)
Visual Studio 2012 (полностью обновлено)
ASP.NET MVC 4
.NET Framework 4
Mono 3.4.0 (вытащил и скомпилировал напрямую из git используя make)
XSP Mono.WebServer2 0.2.0.0 (также из git)
Моя монофоническая установка почти точно следует инструкциям из этого ответа. Что происходит, это:
- Я создаю новый проект MVC 4 в VS 2012, используя параметры по умолчанию.
- Я публикую упомянутое приложение, не меняя настройки "копировать локальную" в указанной DLL, используя профиль публикации файловой системы.
- Затем отправьте файлы по FTP на виртуальную машину Ubuntu и скопируйте их в домашнюю папку веб-сайтов (/var/www/mvc, которую я настроил по умолчанию для Apache2).
cd /var/www/mvc
в командной строке bash и запуститеxsp4
,- Нажмите на сервер / порт и получите эту ошибку:
System.InvalidOperationException
Представление 'index' или его мастер не найдены, или ни один механизм представления не поддерживает искомые местоположения. Были найдены следующие места:
~ / 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
Описание: HTTP 500. Ошибка обработки запроса.
Подробности: исключение не в сети. Источник исключения (имя приложения или объекта): System.Web.Mvc.
Трассировка стека исключений:
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
Информация о версии: 3.4.0 (master/830c517 пт 28 февраля 16:03:26 CST 2014); ASP.NET версия: 4.0.30319.17020
Я пробовал различные комбинации компиляции (нацеливание на 4.5 вместо 4.0, используя MVC 3 вместо 4), удалил WebPages.OAuth.dll, скопировал различные ссылочные комбинации и провел исчерпывающий поиск в Интернете... все безрезультатно. Это как-то связано с моей моно версией? XSP? Есть ли окончательное решение этой проблемы?
ОБНОВИТЬ
Если я нацеливаюсь на.NET Framework 4.5 с проектом MVC 4, ошибка изменится на это:
System.IO.FileNotFoundException
Не удалось загрузить файл или сборку 'log4net, Версия =1.2.11.0, Культура = Нейтральная, PublicKeyToken=669e0ddf0bb1aa2a' или одна из ее зависимостей.
Описание: HTTP 500. Ошибка обработки запроса.
Подробности: исключение не в сети. Источник исключения (имя приложения или объекта): DotNetOpenAuth.Core.
Трассировка стека исключений:
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
Я не использую log4net.
1 ответ
После нескольких дней исследований я узнал несколько вещей, в первую очередь, о том, что Mono 3.x не поддерживается в Ubuntu 12.04.
Итак, о MVC 4 не может быть и речи об этой ОС (и большинстве других ОС Linux, с которыми я сталкивался). Для дальнейшего использования я наконец смог заставить MVC 3 работать на Ubuntu 12.04, выполнив следующие действия:
- Установите Ubuntu 12.04 из ISO с помощью виртуальной машины Hyper-V (я с радостью предоставлю подробную информацию об этой настройке, если кто-то захочет их).
- Установите все обновления Ubuntu (требуется перезагрузка).
- Откройте окно терминала (Ctrl + Alt + T).
(Необязательно) Установите XRDP, который разрешает подключения удаленного рабочего стола к виртуальной машине Ubuntu. Я не выношу окно сервера терминалов по умолчанию для Hyper-V с *nix системами, поскольку сопоставления клавиатуры / мыши глупы.
sudo apt-get install xrdp
(Необязательно) Использование
ifconfig
в терминале, чтобы получить IP-адрес виртуальной машины, который вы можете использовать для подключения к удаленному рабочему столу.Установите Apache2.
sudo apt-get install apache2
Установите Apache2 с резьбой dev (требуется для XSP4, установленного ниже).
sudo apt-get install apache2-threaded-dev
Установите Mono-runtime пакет.
sudo apt-get install mono-runtime
Установите Mono-полный пакет.
sudo apt-get install mono-complete
Установите XSP4 (это очень легкий веб-сервер, который вы можете использовать для разработки).
sudo apt-get install mono-xsp4
Установите пакет примеров ASP.NET. Очевидно, что XSP4 не устанавливает все, что ему нужно, но требует, чтобы некоторый набор компонентов ASP.NET был установлен отдельно, чтобы работать.
sudo apt-get install asp.net-examples
После этого вы можете настроить папку для вашего сайта MVC 3 в /var/www
и бин развернуть ваш сайт. Очень важно, чтобы определенные сборки были скопированы в папку вашего сайта, чтобы это работало, а именно:
- System.Web.Helpers
- System.Web.Mvc
- System.Web.Razor
- System.Web.Routing
- System.Web.WebPages
- System.Web.WebPages.Razor
- System.Web.WebPages.Deployment
Поэтому убедитесь, что они настроены на "копирование локальных" или выясните, где находятся правильные версии в вашей системе Windows, и вручную скопируйте их в папку вашего сайта. Затем вы можете настроить Apache и протестировать свой сайт с помощью XSP4 (опять же, я сообщу подробности, если потребуется):
cd /var/www/sitefolder/
xsp4
Который покажет вам что-то вроде этого:
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.
И вы можете попасть на сайт в браузере на виртуальной машине с localhost:8080
,
Надеюсь, это поможет кому-то в будущем.