Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..

Święta, czas lenistwa i objadania, a może by tak w międzyczasie zrobić coś pożytecznego albo czegoś się nauczyć?

Zgodnie z poprzednimi wpisami, najnowsza wersja Synology DSM dostarcza pakiet Mono, który oprócz możliwości uruchamiania aplikacji napisanych w .NET, pozwala też tworzyć własne strony ASP.NET. Co ciekawe obsługuje też ASP MVC, a że wsparcie bazy danych MySQL jest wbudowane i nic nie trzeba robić, żeby z niej korzystać (no może oprócz zainstalowania pakietu phpMyAdmin), to już jest małe pole do popisu dla kogoś, kto nie chce dodatkowo płacić za zewnętrzny hosting. Lub po prostu szuka rozrywki i chce zobaczyć, czy to faktycznie działa, a swoich wrażliwych danych udostępniać poza własne podwórko.

O zwykłych stronkach ASP.NET oraz MVC piszą wszyscy, zatem zaproponuję coś innego. Chcę, aby każdy (w rozumieniu dowolny, o który zapyta przeglądarka) plik z rozszerzeniem “.echo” w dowolnym folderze zwracał tekst “echo” jako odpowiedź z serwera. Proste?

http://<host>/test-site/site.echo ---> “echo”    
http://<host>/test-site/wei475kra/aka2kdfhwawo24id09hg.echo ---> "echo"

Ktoś zaraz powie, że to głupie i bezsensowne, ale dla mnie nie do końca. Bo jak mamy taką usługę działającą, to już niewiele trzeba, aby z URLa zrobić REST, a proste zwracanie tekstu “echo” przerobić na odpowiedź z serwera potwierdzającą (lub nie) wykonanie zadanej akcji. Innymi słowy rozszerzona wersja, zapytania zwracałaby uwagę na sam kształt URLa, nazwy pliku oraz danych przesłanych (przy żądaniach HTTP POST request):

http://<host>/test-site/psy/list.echo ---> lista psów
http://<host>/test-site/psy/<id>/details.echo ---> szczegóły konkretnego psa
http://<host>/test-site/psy/<id>/delete.echo ---> usuwa zwierzaka z bazy
Adnotacja: dostęp do bazy MySQL otrzymamy pobierając Connector/Net v6.6.4 i używając w projekcie MySql.Data.dll dla .NET Frameworka v2.0.






Przejdźmy wreszcie do sedna, jak to wszystko poskładać:

1. Tworzymy nowy projekt ASP.NET Application w Visual Studio dla .NET Frameworka 2.0

2. Tworzymy własny IHttpHandler, który będzie niedługo obsługiwał zwracanie tekstu ‘echo’ dla wszystkich plików “.echo”. Przykładowo może on wyglądać tak:

public sealed class EchoService : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var response = context.Response;
        response.ContentType = "text/plain";
        response.ContentEncoding = Encoding.UTF8;
        response.Clear();
        response.BufferOutput = false;
        response.Write("echo");
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

3. Zmieniamy plik Web.config, a dokładnie dodajemy sekcję httpHandlers w system.web tak, aby przekierować obsługę plików z rozszerzeniem “.echo” do naszego nowego serwisu (w miejsce <namespace> należy wstawić dokładną przestrzeń nazw klasy w wynikowym assembly):


<system.web>
   ...

   <httpHandlers>
     <add path="*.echo" verb="*" type="<namespace>.EchoService"/>
   </httpHandlers>
</system.web>

Wydawać by się mogło, że to już wszystko. I faktycznie tak by było, gdybyśmy używali produktów Microsoftu (Cassini, IIS, IIS Express). Jednak w naszym świecie Mono + Synology musimy jeszcze troszkę się pomęczyć.

A mianowicie, gdy spróbujemy teraz wgrać naszą aplikację do folderu /volume1/web/test-site, okaże się, że otrzymujemy błąd serwera. Z pomocą przychodzi oczywiście dokumentacja modułu Mono i połączenie go z serwerem WWW Apache. Szczegóły tutaj.


4. Logujemy się z konsoli na Synology i edytujemy plik: mod_mono.conf, dodając do niego między innymi wymuszenie obsługi żądań HTTP dla plików “.echo” przez moduł Mono oraz definiując prywatną aplikację wewnątrz Mono, która sama sobą będzie zarządzać. Bez tego ostatniego kroku Mono po prostu będzie serwować pliki z dysku z zadanej lokacji i oczekiwać, że pliki “.echo” fizycznie istnieją, co przecież nie jest prawdą. Czyli w naszym przypadku cały czas po prostu zwracałoby błąd.

cd /usr/syno/apache/conf/extra
vi mod_mono.conf


I dodajemy w nim na końcu:

AddType application/x-asp-net .echo
Alias /test-site "/volume1/web/test-site"
MonoApplications "/test-site:/volume1/web/test-site"
<Location /test-site>
     SetHandler mono </Location>

5. Na koniec już tylko restart sewera Apache WWW

/usr/syno/etc/rc.d/S97apache-user.sh restart

I gotowe! Wesołych świąt!



Jakiś czas temu pokazałem jak skompilować dystrybucję Mono 2.10.9 na swój NAS. Jednak dlaczego nie posunąć się o krok dalej i nie uruchomić stron ASPX na naszym urządzeniu?

Jak zatem skompilować testowy serwer XSP i uruchomić go? Równie dobry opis znajduje się tutaj (tyle, że po rosyjsku).

 

Zacznijmy zabawę od pobrania i wypakowania źródeł dla serwera XSP:

wget http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
tar -xvf xsp-2.10.2.tar.bz2 cd xsp-2.10.2

Upewnijmy się, że kompilator mono jest widoczny, tworząc odpowiednie dowiązania do /opt/bin:

ln -s /opt/mono-2.10.9/bin/dmcs /opt/bin/dmcs
ln -s /opt/mono-2.10.9/bin/gacutil /opt/bin/gacutil
ln -s /opt/mono-2.10.9/bin/mdoc /opt/bin/mdoc

I przechodzimy do konfiguracji (w razie potrzeby instalujemy brakujące pakiety - ja musiałem chociażby pkgconfig). Tutaj tak samo, jak w przypadku instalacji Mono, nie pozwalamy na bezpośrednią instalację do katalogu /opt/bin, tylko wymuszamy folder “mono-2.10.9”. Pozwoli to trzymać serwer XSP razem z odpowiadającą mu wersją Mono, jak i w przyszłości na szybką deinstalację (razem z Mono) poprzez proste usunięcie tego folderu.

ipkg install pkgconfig
export PKG_CONFIG_PATH=/opt/mono-2.10.9/lib/pkgconfig/
./configure --prefix=/opt/mono-2.10.9 --disable-docs

Budujemy i instalujemy:

make
make install


Build Environment
Install prefix: /opt/mono-2.10.9
Datadir: /opt/mono-2.10.9/share
Libdir: /opt/mono-2.10.9/lib
Build documentation: no
Mono 2.0 compiler: /opt/bin/gmcs
Mono 4.0 compiler: /opt/bin/dmcs
Target frameworks: .NET 2.0, .NET 4.0
Build SQLite samples: yes

Na koniec tworzymy jeszcze niezbędne dowiązania, aby łatwiej uruchamiać testowe strony:

ln -s /opt/mono-2.10.9/bin/xsp2 /opt/bin/xsp2
ln -s /opt/mono-2.10.9/bin/xsp4 /opt/bin/xsp4

Finał! Uruchamiamy przykład:

cd /opt/mono-2.10.9/lib/xsp/test
xsp4 --port 8888 --applications /:.
A w oknie przeglądarki wpisujemy: http://my_nas:8888/. Nic prostszego.

Gotowe!



Czasem zamiast zestawić proxy (ot, chociażby tinyproxy) dużo prościej jest po prostu zalogować się na zdalny serwer i użyć przeglądarki w terminalu – lynx.

Na stacji Synology zainstalujemy ją poprzez polecenie:

ipkg install lynxI dalej z górki: (G) – wpisujemy adres witryny, (Strzałka w Górę) i (Strzałka w Dół), przechodzimy po łączach, (Spacja) – następny ekran, (Strzałka w Lewo) – cofnij do poprzedniej witryny, (Strzałka w Prawo) – otwórz zaznaczone łącze, (D) – pobierz plik…

Co jednak, jeśli chcemy za jej pomocą pobrać duże pliki? Takie powiedzmy 1GB i więcej?

To boleśnie przekonamy się o tym, że nasza stacja nie ma tyle miejsca na dane tymczasowe i wszystko zostanie urwane w połowie.

Prosta rada, to przed uruchomieniem lynxa, ustawić tę oto zmienną środowiskową:

export LYNX_TEMP_SPACE=/katalog/z/dużą/ilością/wolnego/miejsca

Ciekawostka jest taka, że nawet najnowsza wersja przeglądarki (tj. 2.8.6) nie umożliwia podania tego katalogu w pliku konfiguracyjnym lynx.cfg.

 

Udanego pobierania!



Z niewiadomych powodów Synology usunęło pakiet Mono z repozytorium ipkg. Jednak i na to znajdzie się sposób. Przecież wszystko da się skompilować ze źródeł.

Poniżej przestawię jak to zrobić. Przyznaję jednak, że jest to tylko tłumaczenie. Oryginalny post znajduje się tutaj. Wielkie dzięki dla Kennetha za jego wysiłek! Mój wkład, to przetestowanie tego na DS411 oraz użycie stabilnej wersji Mono-2.10.9 zamiast Mono-alpha-2.11.0, czyli mimo wszystko nie za dużo ;)

Ostrzeżenie: ta kompilacja można na prawdę zająć duuużo czasu, liczonego w godzinach.

 

  • Na początku instalujemy wymagane narzędzia do przeprowadzenia kompilacji:
ipkg install wget nano make automake autoconf bison \
    glib libc-dev libstdc++ m4 gcc gawk textutils gettext zlib
  • Pobieramy i wypakowujemy źródła projektu Mono:
wget "http://download.mono-project.com/sources/mono/mono-2.10.9.tar.bz2"
tar -xf mono-2.10.9.tar.bz2
  • Konfigurujemy źródła dla naszej maszyny:
cd mono-2.10.9 ./configure --prefix=/opt/mono-2.10.9

Przełącznik ‘prefix’ pozwoli nam później zainstalować skompilowaną wersję Mono w tym właśnie folderze, zamiast użycia domyślnego “/usr”. Dzięki temu w przyszłości łatwiej będzie wszystko usunąć lub aktualizować.

  • Edytujemy konfiguracje, tak aby dodać łączenie z biblioteką “rt”.
    Rozwiązuje to problem opisany tutaj, gdzie brakuje metod odwołujących się to czasu procesora.

W plikach:

mono/metadata/Makefile
mono/mini/Makefile
mono/profiler/Makefile

Edytujemy wartość zmiennej flag dla linkera (LDFLAGS):

LDFLAGS = -lrt
  • Dodatkowo, poprawiamy problem z nieistniejącymi symbolami w bibliotece pthreads, która domyślnie instaluje się z pakietów ipkg. Problem szczegółowo opisany na forum Synology.

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

  • Kompilujemy:

make

  • Instalujemy (automatycznie do /opt/mono-2.10.9):

make install

  • Dowiązujemy narzędzia, tam gdzie zainstalowałyby się domyślnie:

ln -s /opt/mono-2.10.9/bin/mono /opt/bin/mono
ln -s /opt/mono-2.10.9/bin/mcs /opt/bin/mcs
ln -s /opt/mono-2.10.9/bin/gmcs /opt/bin/gmcs

  • I finalny test:

mono --version
Mono JIT compiler version 2.10.9 (tarball Tue May 29 16:18:24 CEST 2012)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
TLS: normal
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)

Gotowe, brawo!



Autor

Paweł Hofman [CodeTitans]

ASP.NET
C/C++, C#, Objective-C
SQL

License and Disclaimer

Moje Gry i Aplikacje

Zobacz mnie na GoldenLine

Zobacz mnie na LinkedIn
Supported by Polish SQL Server User Group (PLSSUG)

Supported by WrocNet.org

Zine.net.pl

Wpisy

Projekty

Moje projekty open-source:

Sign in