1. 程式人生 > >Linux 部署ASP.NET SQLite 應用 的坎坷之旅 附demo及原始碼

Linux 部署ASP.NET SQLite 應用 的坎坷之旅 附demo及原始碼

Linux 部署ASP.NET SQLite 應用 的坎坷之旅。文章底部 附示例程式碼。

有一臺閒置的Linux VPS,嘗試著部署一下.NET 程式,結果就踏上了坑之路,不過最後算是完美解決問題,遂記錄如下。

環境:Linux系統為centos 6  mono 版本 mono-3.2.1  jexus版本 jexus-5.6.4

一.安裝環境

1.安裝mono

首先安裝系統環境:

yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel libjpeg-devel libtiff-devel libexif-devel giflib-devel libX11-devel freetype-devel fontconfig-devel  cairo-devel

下載mono 安裝:

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

tar -jxvf  mono-3.2.1.tar.bz2

cd mono-3.2.1

./configure –prefix=/usr

make    此時出現以下錯誤

../src/.libs/libeglib.a(libeglib_la-gunicode.o): In function `monoeg_g_get_charset’: 
/root/mono-3.2.1/eglib/src/gunicode.c:223
: undefined reference to `locale_charset’ collect2: ld returned 1 exit status make[4]: *** [test-eglib] Error 1 make[4]: Leaving directory `/root/mono-3.2.1/eglib/test’ make[3]: *** [all-recursive] Error 1 make[3]: Leaving directory `/root/mono-3.2.1/eglib’ make[2]: *** [all] Error 2 make[2]: Leaving directory `/root/mono-3.2
.1/eglib’ make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/mono-3.2.1make: *** [all] Error 2 修改 eglib/config.h vi eglib/config.h 將#define HAVE_LOCALCHARSET_H 1 替換為 #define HAVE_LOCALCHARSET_H 0 make make install mono –V 這一步顯示資訊代表安裝成功

2.安裝jexus  

cd /tmp
wget linuxdot.net/down/jexus-5.6.4.tar.gz 
tar -zxvf jexus-5.6.4.tar.gz 
cd jexus-5.6.4 
sudo ./install 

jexus 相關配置說明:http://www.linuxdot.net/bbsfile-3084

二.程式碼部分

有兩種方式可以在Linux上使asp.net 操作sqlite。

由於Linux自帶sqlite 環境,所以無需安裝環境。而Windows沒有需要安裝sqlite,或者下載sqlite3.dll。

本文示例採用WebForm 開發。

1.使用Mono自帶的 Mono.Data.Sqlite

 使用方法和Ado.Net 相同。這裡就不做過多講解。

主要在連結字串部分 "Version=3;Data Source={檔案路徑}"

2.使用NuGet中的sqlite-net (最終採用的方法,比較完美)

Install-Package sqlite-net

github:  https://github.com/praeclarum/sqlite-net

wiki:  https://github.com/praeclarum/sqlite-net/wiki

安裝好後就可以開發。wiki 裡面講解了一些詳細的用法。

我只是實現一些簡單的增刪查改操作。

使用方法:

[PrimaryKey, AutoIncrement] //主鍵加自增
public int ID { get; set; }

更多方法參見wiki

基本的一些程式碼

public partial class Demo : System.Web.UI.Page
    {
        private SQLiteConnection con = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            var path = Server.MapPath("~/App_Data/Demo.db");
            con = new SQLiteConnection(path);
            //con.CreateTable<User>();//建立表 只需執行一次

            if (!string.IsNullOrEmpty(Request["id"]))
            {
                con.Delete<User>(Request["id"]);
                Response.Redirect("Demo.aspx");
            }

            var cmd = con.CreateCommand("select * from User");
            var list = cmd.ExecuteQuery<User>();
            foreach (var item in list)
            {
                Response.Write(string.Format("{0}-{1}-{2}   <a href='Demo.aspx?id={3}'>刪除</a><br>", item.Name,item.PassWord,item.CreateTime,item.ID));
            }
        }

        protected void BtnAdd_Click(object sender, EventArgs e)
        {
            var rand = new Random().Next(100, 999);
            User user = new User();
            user.Name = "ceshi"+rand;
            user.PassWord = "123456"+rand;
            user.CreateTime = DateTime.Now;
            con.Insert(user);//新增資料
            Response.Redirect("Demo.aspx");
        }
    }

最終釋出的程式採用winscp上傳到vps中的。完美在linux上執行。

執行截圖:

 上面的系統標識為linux。

三.總結

asp.net mvc 5.0版本及以上在linux mono 環境下支援不是特別好。

感謝@張善友 提醒: Windows不區分大小寫,Linux嚴格區分大小寫。所以路徑須保持大小寫一致。

最後感謝網路上的各位前輩的無私分享。特別感謝 園子@張善友的分享。

參考連結: http://www.cnblogs.com/shanyou/p/3322811.html

      http://www.jexus.org/

      http://www.linuxdot.net/

如果你覺得本文對你有幫助,請點選“推薦”,謝謝。