1. 程式人生 > >【ASP.NET Core】在Win 10 的 Linux 子系統中安裝 .NET Core

【ASP.NET Core】在Win 10 的 Linux 子系統中安裝 .NET Core

刪除 passwd direct win 10 管理 string app pla 服務

在上一篇文章中,老周扯了一下在 Windows 10 中開啟 Linux 子系統,並且進行了一些簡單的設置。本篇咱們就往上面安裝 .net core 。

老周假設你從來沒有用過 Linux,所以,接著上一次的博文,老周先給您介紹幾個可能比較常用的東東。

切換到 root 用戶上下文

當你啟動 Ubuntu 子系統後,你會看到,在你的用戶名、機器名、路徑名後有個 $ 符號。如下圖。

技術分享圖片

這表示當前用戶的權限是受到限制的,如果想要執行某些需要高權限的命令(這個類似於 Windows 中的以管理員身份運行),你需要在命令前面加上 sudo,比如

sudo command....

舉個例子,刪除某個目錄下的所有文件。

sudo rm -rf ~/bin/*

不過,有些命令,你加上 sudo 後仍然會提示權限不夠,在不修改權限的情況下(一般來說最好不改)可以切換到 root 上下文,方法是輸入

技術分享圖片

或者省略 root ,直接輸入 su ,默認也會切換到 root 上下文。

技術分享圖片

這時會提示你輸入 root 的密碼,但這個密碼現在是隨機的,你並不知道它是什麽。

所以,我們要為 root 設置一個密碼,輸入

sudo passwd root

技術分享圖片

現在,你先要輸入你的密碼,就是剛剛初始化 Ubuntu 時你輸入的那個密碼。

技術分享圖片

現在你可以為 root 設置密碼了。

技術分享圖片

你還要確認一次密碼。

技術分享圖片

現在,root 的密碼就設置完成了。

技術分享圖片

輸入 su 後,輸入剛剛設定的 root 密碼,就可以切換到 root 上下文了。

技術分享圖片

這個時候,你會發現,工作目錄後面的 $ 符號已經變成 # 符號了,表示這是超級用戶的上下文。

如何訪問 Windows 目錄和文件

這個 Linux 子系統的一個好處是可以直接訪問 Windows 目錄和文件,如果用於開發測試,比虛擬機方便很多。

訪問Windows文件的一個最簡單的方法,你可以在任何目錄下執行 Powershell 或者 CMD,然後輸入 bash 命令,就可以用當前目錄來作為工作目錄,並進入 Liunx 子系統。

技術分享圖片

第二種方法,在 Linux 子系統中,通過 /mnt 下面的路徑來訪問。用過安卓模擬器的朋友應該知道這個目錄。

舉個例子,我要進入 D 盤下的 Apps 目錄,可以輸入

cd /mnt/d/apps

再比如,下面命令可以列出 C 盤下的 Windows/System32中的文件。

ls /mnt/c/Windows/System32

要註意大小寫啊,而且路徑分隔符要用 /。

技術分享圖片

離線安裝 .NET Core SDK

關於.net core sdk 的安裝,你可以根據微軟官方的教程,直接照抄即可,詳細請看: https://www.microsoft.com/net/learn/get-started/linuxubuntu

這裏老周介紹一下如何離線安裝,因為有些閹割版 Linux 服務器連 yum 或 apt 都沒有。前段時間用阿裏雲的一個 CentOS 6.5,想升級到 7.0,結果那王八居然沒有 yum ,想手動安裝,結果下載了一堆的 rpm 包,都裝不上,很多依賴庫都丟失,實在折騰不下去了,就找阿裏的技術支持,把它們 fuck 了一頓。

想執行 dotnet 命令,你得裝 SDK ,不能裝 runtime,runtime 是用不了 dotnet 命令的。

離線安裝的好處就是你可以事先下載好包,然後傳到服務器上去。當然,也可以在服務器上直接下載,用 wget 命令下載。

先切換到臨時目錄。

cd /tmp

然後輸入wget命令下載。

wget https://download.microsoft.com/download/1/1/5/115B762D-2B41-4AF3-9A63-92D9680B9409/dotnet-sdk-2.1.4-linux-x64.tar.gz

這個下載,還是挺花時間的,所以,你可以坐下來喝兩杯茶。直到 100% 就表示下載完了。

技術分享圖片

如果下載到半路掛了不動,你可以按【Ctrl + C】,然後它會重試繼續下載,直到下載為止。如果實在不行,你可以在Windows中用迅雷等工具下,然後復制進Linux 目錄就行了,復制用 cp 命令

cp /mnt/c/Users/xxx/Downloads/dotnet-sdk-2.1.4-linux-x64.tar.gz /tmp/dotnet-sdk-2.1.4-linux-x64.tar.gz

現在 ls 一下,看看 tmp 目錄下是不是有個壓包。

技術分享圖片

其實這個是不用安裝的,直接解壓出來就可以耍。

1、切換到你當前的目錄下,輸入 cd ~

技術分享圖片

2、用 mkdir 命令創建一個 dotnet 文件夾。

mkdir dotnet

然後用 cd 命令進入 /tmp,就是剛才下載文件存放的目錄。

 cd /tmp

3、把剛剛下載的那個 tar.gz 包解壓到 /home/你的用戶名/dotnet 目錄下。

tar -zxf dotnet-sdk-2.1.4-linux-x64.tar.gz -C ~/dotnet

-C 參數指定,解壓出來的東西放到 /home/xxxx/dotnet 目錄下,~/表示的就是 /home/用戶名 目錄。註意 -C 是大寫字母!!!

- z表示用 gzip 算法處理文件,-x表示解壓操作,-f是必須,表示你要操作的文件。上面的 -zxf是三個參數合起來使用,而且,-f 必須放到後面,因為 -f 後面必須指定文件名。最後 -C 指定工作目錄。

大約等待十幾秒,就解壓完成了。

4、進入 /home/用戶名/dotnet 目錄。

cd ~/dotnet

然後用 ls 命令看看裏面是否有東西。

技術分享圖片

然後,你可能會遇到這樣的錯誤。

技術分享圖片

不要急,這是缺少了某個庫導致,執行以下命令安裝一下:

sudo apt install libunwind8

技術分享圖片

接著,你再執行一下:

~/dotnet/dotnet --info

如果看到以下內容,那恭喜發財,你的 .net SDK 可以正常運行了。

技術分享圖片

但是,你也發現了,執行 dotnet 命令很是不方便,路徑太長。這時候你一定會想到,設置一下 PATH 環境變量。老周個人覺得嘛,不輕易改動環境變量是最好的方案,我們輸入以下命令,看看 PATH 變量中都有哪些路徑。

echo $PATH

輸出內容如下。

技術分享圖片

於是,老周選擇了 /home/zhou/bin,即 ~/bin。

用 cd ~ 切換到你的 home 目錄下,然後 ls 一下,看看有沒有 bin 目錄。

技術分享圖片

顯然是沒有的,所以,創建一個 bin 目錄。

mkdir bin

然後用 ln 創建一個符號鏈接,放到 bin 目錄下,並且指向 dotnet/dotnet 文件。

ln -s ~/dotnet/dotnet ~/bin/dotnet

這樣一來,你只需要執行 dotnet 就可以了。

在線安裝 .NET Core SDK

其實官方的教程就是在線安裝的,這裏老周說一下另一種安裝方法。

官方教程中用的是 apt-get 命令來安裝的,其實我們可以用 apt 命令代替 apt-get。APT 是通過一系列的 source 來獲取軟件包的,這些source都是以後綴為 .list 的文件存放,主要在兩個地方:

1)文件:/etc/apt/sources.list

2)目錄:sources.list.d

一般來說,我們如果是自己定義的軟件源,可以放到 sources.list.d 目錄下,文件名以 .list 結尾。

默認情況下,sources.list 文件中的源都是 ubuntu 官方的,但是,國外的服務有時候很慢,有時候也經常掛,所以,我們不妨改為國內的源。國內的源可以網上找,老周一直都是用 163 的,優點是速度快。

方法是修改 sources.list 文件,你可以先進行備份,當然你不備份也行。要備份的話,可以用復制文件的命令。

先換到 apt 目錄。

cd /etc/apt

然後

sudo cp sources.list sources.bak

這是系統目錄,需要高的權限,所以要加上 sudo。

執行後,你就會看到備份的文件了。

技術分享圖片

接著,用 echo 命令把 sources.list 文件的內容清空。這時候你得 su 切換到 root 上下文,不然可能不讓你寫文件。

echo "" >sources.list

把空白字符串輸出到文件中,就等於清空文件了,然後我們用 nano 來輸入 163 的源,因為這個軟件好像沒有全選功能,反正老周是找不到可以全選的。

nano sources.list

然後,你每行一條,輸入以下內容:

deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse

有這四條就夠了,還有一條是可選,因為它用於測試版的軟件。

deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse

技術分享圖片

輸完之後,按 Ctrl + O 保存,在提示的文件名處,保留 sources.list 不要改動,這樣就會替換文件的內容了。最後按 Ctrl + X 退出。

修改完 sources.list 後,我們還要添加微軟的軟件源,以便在線安裝。

輸入

cd sources.list.d

進入 sources.list.d 目錄,接著輸入:

echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > my.list

這樣就把源 URL 寫入到文件中,文件名為 my.list,存放在 sources.list.d 目錄下。

更改完源後,你要執行一下 apt update ,更新源列表,這是必須的。

技術分享圖片

從輸出內容看到,微軟的源也在其中了,但,你看清楚了,有這麽一行。

技術分享圖片

這個錯誤是獲取不到有效的簽名,如果你按照官方的教程,先註冊簽名,是不會有此錯誤的,但因為此次並沒有按官方的教程操作。

請把錯誤信息中 NO_PUBKEY 後面的那個字符串記下來,等一下會用到。

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB3E94ADBE1229CF

最後面那個字符串就是從錯誤信息中記下來的,執行上面這一條命令後,簽名就被導入了。

然後你再執行一次 apt update。

技術分享圖片

這樣就成功更新源了。

接著你可以通過以下命令,看一下跟 dotnet sdk 有關的 package。

apt list | grep dotnet-sdk-*

上面命令中有個管道符號(|),它會把前一條命令的執行結果傳遞到第二條命令。apt list 命令用來獲取 source list 中查詢到的軟件包,然後列出來。列出來的軟件包列表就傳給 grep 命令,grep 命令可以使用正則表達式來查找內容,此處咱們匹配所有以 dotnet-sdk- 開頭的包。

過濾後的結果如下圖所示。

技術分享圖片

目前,.net sdk 的最新版本是 2.1.4,我們安裝最新版本即可。

安裝軟件包,使用 apt install <包名稱>。咱們安裝 2.1.4。

sudo apt install dotnet-sdk-2.1.4

如果你不執行 su 切換到 root 上下文,就要加上 sudo ,否則是沒有權限安裝的。

技術分享圖片

這時候它提示你,連同 SDK 一起安裝的一堆軟件包,並告訴你可能要占用 300 多MB的空間,然後問你是否安裝。

如果你要安裝,就輸入 y 並回車,如果不想安裝就輸入 n 並回車。都走到這一步了,當然是要安裝的了。

隨後你就慢慢等吧,等它安裝完成。

測試運行

啟動 VS ,新建一個 ASP.NET Core 項目,假設項目名字叫做 MyApp。

技術分享圖片

然後讓你選一個模板,對於 ASP.NET Core 項目,其實你選哪個模板都行,像什麽 MVC ,什麽 Web API,全部都是可以通過代碼來開啟,都是集成的,所以我說它比傳統的 asp.net 要簡單。

這裏只為了驗證,所以只選“空”模板就可以了。

技術分享圖片

等項目創建後,打開 Startup 類,找到 Configure 方法(註意,不是 ConfigureServices 方法,ConfigureServices 方法主要是開啟應用程序的擴展功能的,你要用到什麽就開啟什麽,比如 MVC),而 Configure 方法才是跟應用程序自身處理有關的,它通過各種稱為“中間件”的玩意兒來處理 HTTP 請求。所謂中間件,你就理解為 HTTP 請求到達服務器後的各道“工序”,等所有中間件都對 HTTP 消息處理完畢後,就會返回給客戶端(比如瀏覽器)。

把 Configure 方法改為以下代碼。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("這是一個很強大的應用。");
            });
        }

如果調用的是 app.Use 或者 app.UseXXX,就是作為中間件來處理 http 請求。Use 方法是直接通過一個委托來處理 HTTP 請求,一般用於簡單的處理,比如只有兩三行代碼,如果處理比較復雜(例如一些自定義的驗證方案),就可以寫一個中間件類,然後插入消息處理隊列中。

這裏調用了 Run 方法,因為代碼很簡單,只是返回一個字符串,不需要經過 N 個工序,Run 方法使得消息處理“短路”,不分工序直接一步完成,就返回給客戶端。

打開 Program 類,把 Main 方法改為。

    public class Program
    {
        public static void Main(string[] args)
        {
            var hostBuilder = new WebHostBuilder();
            // 構造 web host
            var host = hostBuilder.UseKestrel()
                                  .UseStartup<Startup>()
                                  .UseContentRoot(Directory.GetCurrentDirectory())
                                  .UseUrls("http://localhost:7000")
                                  .Build();
            // 運行 host
            host.Run();
        }
    }

在構建 web host 時:

1、使用 Kestrel 作為 Server。

2、將當前目錄作為應用的根目錄。

3、在 7000 端口上監聽客戶端請求。

最後調用 Build 方法生成 host,所以你會看到,asp.net core 很靈活,很多功能你都可以隨意增減。

在“解決方案資源管理”器窗口中,在項目節點上右擊,從彈出的菜單中選擇【發布】。

技術分享圖片

選擇發布到文件夾。

技術分享圖片

發布後,打開發布目錄,如下圖所示。

技術分享圖片

然後以這個目錄為工作目錄,打開 Power shell 或CMD。

技術分享圖片

輸入 bash 命令進入 Linux 子系統。輸入:

dotnet MyApp.dll

註意文件名是區分大小寫的。

看到以下信息,就說明 asp.net core 應用已經運行起來了。

技術分享圖片

打開瀏覽器,輸入 http://localhost:7000,看看效果。

技術分享圖片

這時候你發現是亂碼,可能你會想到在 Response.WriteAsync 方法調用時加上 Encoding 參數。

其實問題不是出在這裏,而是出在 content-type 頭上,所以,你應該加上:

            app.Run(async (context) =>
            {
                context.Response.ContentType = "text/plain;charset=utf-8";
                await context.Response.WriteAsync("這是一個很強大的應用。");
            });

重新發布一下。然後再次從瀏覽器訪問,如下圖所示。

技術分享圖片

好了,今天的內容就說到這裏了,下一篇,老周介紹一下如何配置 nginx 服務器。

【ASP.NET Core】在Win 10 的 Linux 子系統中安裝 .NET Core