ASP.NET MVC 3 сервер на NAS Synology — solution

в 20:03, , рубрики: .net, asp.net mvc 3, Mono и Moonlight, метки:

ASP.NET MVC 3 сервер на NAS Synology — solution
Имея в хозяйстве замечательный накопитель от компании Synology, я довольно долгое время грустил по поводу того, что в нём отсутствует хостинг .NET приложений. И вот, вооружившись мат. частью приведённой в статье habrahabr.ru/post/121159/ я озадачился созданием домашнего сервера для проектов на ASP.NET MVC. Пакет mono там довольно старый, а классическая последовательность команд для сборки оного не привела к успеху. Информация собиралась из различных источников, в том числе и с хабра, по крупицам давая понимание, что и в какой последовательности необходимо делать. Прохождение этого квеста я как раз и хочу описать в этой статье. Надеюсь кому-то пригодится.

Итого, дано:
1. Железо: NAS Synology 110j с процессором Marvell mv5281 на борту.
2. ОС DSM 4.0 (на базе малораспространённого дистрибутива Linux)
Необходимо: Установить последнюю версию mono + xsp.

Подготовка

Компания Synology не озадачилась предоставить возможности для установки дополнительных пакетов традиционным для *nix систем способом, т.е. через консоль. Поэтому для начала необходимо ознакомится с топиком по адресу www.synology-forum.ru/index.php?showtopic=38, и выполнить необходимые телодвижения. Конечным результатом будет установка и запуск консольного менеджера пакетов ipkg. Я не могу в этой статье привести краткий конспект, поскольку накопители Synology выпускаются на различных процессорах и рецепт для каждой архитектуры будет свой.

Сборка и установка MONO

После того как заработал менеджер пакетов ipkg, получаем и распаковываем последние исходники mono (на тот момент это был 2.10.9). По ходу повествования, если необходимо, доустанавливайте необходимые пакеты с помощью ipkg самостоятельно, поскольку в силу специфики «железки» я не могу полностью виртуализировать среду для чистого эксперимента, а многие пакеты у меня были поставлены по ходу «плясок с бубном» и я уже подзабыл что необходимо устанавливать дополнительно.

wget http://download.mono-project.com/sources/mono/mono-2.10.9.tar.bz2
tar -xvf mono-2.10.9.tar.bz2

Процесс сборки mono:

cd mono-2.10.9
./configure --prefix=/usr --sysconfdir=/etc/mono

должно проходить нормально, если что не так смотрим в config.log. Вероятнее всего необходимо будет доставить некоторые пакеты.

Напоминаю, что просто команда make у меня не справилась с компиляцией. Необходимо добавить флаги '-Wl,-lpthread,-lrt'. Но этого оказалось мало. При линковке с библиотекой pthread в последней отсутствовали некоторые функции. Возможно, что это связано с архитектурой и на Intel`ах будет всё OK. Тем не менее, на моём ARM непосредственно перед компиляцией, мне дополнительно пришлось выполнить следующие заклинания:

mkdir /opt/arm-none-linux-gnueabi/lib_disabled
mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
cd /opt/arm-none-linux-gnueabi/lib/
ln -s libpthread.so.0 libpthread.so
ln -s libpthread.so.0 libpthread-2.5.so

В /opt/etc/ipkg/cross-feed.conf изменить на
src/gz cross ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable

ipkg remove perl
ipkg install perl

Магия с libpthread была выяснена гуглением и как ясно из команд мы подменяем библиотеку. Мне не ведомо, почему так случилось, но это факт. А вот переустановка perl – это вообще нечто. У меня изначально пакеты ставились из «нестабильной» ветки (unstable). Возможно, что в вашем случае всё будет нормально.

Итак, запасаемся попкорном и компилируем… процесс не быстрый и местами даже интересный.

make CFLAGS+='-Wl,-lpthread,-lrt'

Итак, если компиляция mono закончилось успешно, устанавливаем его командой

make install

и проверим

mono --version 

должна выдать что-то вроде

Mono JIT compiler version 2.10.9 (tarball Sun Apr 15 18:40:39 MSK 2012)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,soft-float
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC and Parallel Mark)

Сборка и проверка XSP

Среда установлена, теперь необходимо установить XSP – сервер ASP.NET приложений для mono. Я понимаю, что «сервер ASP.NET» для XSP — это звучит слишком сильно, но и не забываем, на чём он будет эксплуатироваться.

Здесь всё банально…

wget http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2
tar -xvf xsp-2.10.tar.bz2
cd xsp-2.10
./configure
make install

после установки проверим:

cd /src/Mono.WebServer.XSP
mono xsp4.exe --applications /:./../../test

должна выдать

xsp4
Listening on address: 0.0.0.0
Root directory:  /xsp-2.10/src/Mono.WebServer.XSP
Listening on port: 8080 (non-secure)
Hit Return to stop the server.

Запускаем броузер, набираем адрес NAS и порт 8080. Наш сервер должен выдать тестовую страницу
ASP.NET MVC 3 сервер на NAS Synology — solution

Готовим подопытное ASP.NET MVC приложение

1. Создаём проект ASP.NET MVC 3 Web Application
ASP.NET MVC 3 сервер на NAS Synology — solution

2. Я выбирал Internet Application
ASP.NET MVC 3 сервер на NAS Synology — solution

3. В исходный текст внесём небольшое исправление
ASP.NET MVC 3 сервер на NAS Synology — solution

4. Я настроил публикацию через файловую систему (выберите по вкусу то, что настроено на вашем NAS, например FTP)
ASP.NET MVC 3 сервер на NAS Synology — solution

5. Запускаем XSP на папку в которую будем деплоить наше приложение

mono xsp4.exe --applications /:./volume1/web/TestMvcOnSynology

6. Далее необходимо включить в проект сборки MVC, чтобы они деплоились вместе с нашим приложением, поскольку в MONO они отсутствуют. Для этого в свойствах подключенных сборок устанавливаем свойство «Копировать локально» в True. Список сборок: System.Web.Helpers, System.Web.Mvc, System.Web.WebPages, добавляем сборки System.Web.Razor, System.Web.WebPages.Razor, System.Web.WebPages.Deployment и также устанавливаем свойство «копировать локально» в true.
7. Так же, в целях ознакомления, я «вырезаю» из приложения авторизацию и все упоминания об EntityFramework (это тема отдельной статьи).
1. Удаляем ссылку на EntityFramework, System.Data.Entity
2. Исключаем из проекта AccountController.cs;
3. из Моделей исключаем AccountModels.cs;
4. из представлений исключаем полностью папку Account
5. В _Layout.cshtml удаляем секцию с id=logindisplay
6. Исключаем из проекта файл _LogOnPartial.cshtml

Всё. Можно деплоить приложение и наслаждаться результатом:
ASP.NET MVC 3 сервер на NAS Synology — solution

Напоследок

1. Учитывая, что Microsoft не так давно открыла исходники всего стека ASP.NET вероятнее всего более правильно будет подключить пакет MVC из codeplex`а к приложению и все ссылки переключить на него и в таком виде деплоить приложение.
2. Вместо вырезания авторизации необходимо реализовать собственные механизм без использования EntityFramework, но, как я указывал, это отдельная тема.

Автор: AndyGrom


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js