2012/05/23(水)QNAP TS-219P+にMonoを入れてASP.NETからMySqlを触ってみる。

はてブ数 2012/05/26 03:55 計算機な日記::ボクと計算機つーさ

例によって、自宅サーバならぬ自宅NAS。
今回はASP.NETを動かそう。これが動くと、
Visual StudioとC#で簡単にWEBアプリが作れる。
そいつぁやばい。是非やってみようじゃないか。

monoを入れる

mono と xsp と mod_mono を用意。
それぞれ configure, make, make install する。した。
distccを入れてから、make もずいぶん楽になった。

libgdiplusとか色々要求されて若干めんどくさい。
gdiplusはipkgに見つからなかったので、自前でmakeしようと思ったら、
X11/X.hがないよ!とか言われる。え、Xに依存してんのかあり得ん。
cairoはipkgで入るので libgdiplusのmakeに必要なヘッダだけ取ってくりゃいいか?
ってことで適当にコンパイル通した。動いたっぽい。以下メモ

## mono
ipkg install gettext

export PKG_CONFIG_PATH=/opt/local/lib/pkgconfig:/opt/lib/pkgconfig
export DISTCC_HOSTS="T8/24"
export CC="distcc armv5tel-softfloat-linux-gnueabi-gcc" CFLAGS="-O3"
export CXX="distcc armv5tel-softfloat-linux-gnueabi-g++" CXXFLAGS="-O3"
export LDFLAGS="-O3"

wget http://download.mono-project.com/sources/mono/mono-2.11.0.tar.bz2
tar xf mono-*
cd mono-*
./configure --prefix=/opt/local/mono --with-static_mono=yes --without-x --with-ikvm-native=no
make -j 20 && make install

wget http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2
tar xf xsp-*
cd xsp-*
./configure --prefix=/opt/local/mono
make -j 2 && make install

wget http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2
tar xf mod_mono-*
cd mod_mono-*
CFLAGS="$CFLAGS -I/opt/local/apache2/include/" ./configure --prefix=/opt/local/mod_mono --with-apxs=/opt/local/bin/apxs

## libgdiplus
wget http://ftp.novell.com/pub/mono/sources/libgdiplus/libgdiplus-2.10.tar.bz2
ipkg install glib cairo
wget "http://cvsweb.xfree86.org/cvsweb/*checkout*/xc/include/Xosdefs.h?rev=1.8" -O /opt/include/X11/X.h
wget "http://cvsweb.xfree86.org/cvsweb/*checkout*/xc/include/Xosdefs.h?rev=1.8" -O /opt/include/X11/Xfuncproto.h
wget "http://cvsweb.xfree86.org/cvsweb/*checkout*/xc/include/Xosdefs.h?rev=1.8" -O /opt/include/X11/Xosdefs.h

tar xf libgdiplus-*
cd libgdiplus-*
./configure --prefix=/opt/local/mono
make -j 20 && make install
ln -s /opt/local/libgdiplus/lib/* /opt/local/lib/
ln -s /opt/local/libgdiplus/lib/pkgconfig/* /opt/local/lib/pkgconfig/

httpd.conf をいじる。

xspのサンプルを動かしてみようと思って色々書くが、
Service Temporarily Unavailable ???
http://stackoverflow.com/questions/7968015/mono-apache2-service-temporarily-unavailable-503
とか見ながらいじる。503が出つつ error_log に色々出たりする。
503なのは、mod-mono-serverが起動できなかった原因が特定できず回復するかもしれないとApacheが思うからかもしれない。
あれこれいじってみるが、ぜんぜんさっぱり。よくわからず。
最終的に、書き足した項目を全部消すと、実は何も書かなくてもAutoで動くんですというオチ。
Visual Studioで作ったWebアプリケーション(Hello ASP.NETをH1で出力するだけのもの)も動いた。オッケー☆

じゃあ次は、データベースでしょう

MySqlをMonoから使う方法として、Connector/NET を準備する。
Connector/NETをWindowsにも入れると、Visual Studioのデータ接続からMySqlにつなげるようになる。
DBサーバにTCP 3306経由でつながるようにしておくと楽かもしれない。

デザイナ上でGridViewを一個作って、データソースとしてMySqlのDBを指定。
クエリビルダで適当にSELECT文を作る。欲しい列にチェックを入れるだけでSELECT文ができる!
INNER JOINも勝手に書いてくれた。ちょっと間違ってたけど(笑
クエリのテストを行うと、制約条件がどうたらこうたらと怒られるけど、気にせずOKしたら
テーブルの中身をDataGridに出力するだけのアプリが完成。F5で試す。動いた。発行。
標準でページャーとソーターのおまけつき! すごい簡単!

発行

僕はWebサーバのDocumentRootをネットワークドライブとしてマウントしてるので、
フツーにローカルファイルシステムに発行するだけ。発行自体は簡単にできた。

が、動かん。
Web.configの<system.web><customErrors mode="Off" />を書くと、
アプリが吐いた例外の情報とか見えるようになるらしいのでトラブルシュートしていく

Failed to find or load the registered .Net Framework Data Provider 'MySql.Data.MySqlClient'.

Connector/NET が読めていないようだ。
MySql.Data.dllをGACに登録するだけではダメらしい。
<system.data><DbProviderFactories>を書き足す。発行。更新。

Could not load type 'System.Security.SecurityRulesAttribute' from assembly 'MySql.Data'.

System.Security.SecurityRulesAttribute は、.NET 4のクラスらしい。
mod-mono-server2で動かしてるのに、なぜそれを探しに行くのか……。

何が悪いのかわからないけど、とりあえず、MySql.Data.dllの中っぽいので、
MySql.Data.dllを.NET4が存在しなかったころのものにすれば動くだろうと考える。
v5.2.7をダウンロードしてきて、gacutilでGACに登録して DbProviderFactoriesも書き換え。

  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient"
               description=".Net Framework Data Provider for MySQL"
               type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, 
               Version=5.2.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

動いた。おめでとう。

次は、Razorに挑戦してみたい。
http://www.atmarkit.co.jp/fdotnet/scottgublog/20100714razor/razor.html

とかやってる間に 新しい mono 2.11.1 が出てる。おさかん。