【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

在上一篇文章中,老周扯了一下在 Windows 10 中开启 Linux 子系统,并且进行了一些简单的设置。本篇咱们就往上面安装 .net core 。

老周假设你从来没有用过 Linux,所以,接着上一次的博文,老周先给您介绍几个可能比较常用的东东。

切换到 root 用户上下文

当你启动 Ubuntu 子系统后,你会看到,在你的用户名、机器名、路径名后有个 $ 符号。如下图。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这表示当前用户的权限是受到限制的,如果想要执行某些需要高权限的命令(这个类似于 Windows 中的以管理员身份运行),你需要在命令前面加上 sudo,比如

sudo command....

举个例子,删除某个目录下的所有文件。

sudo rm -rf ~/bin/*

不过,有些命令,你加上 sudo 后仍然会提示权限不够,在不修改权限的情况下(一般来说最好不改)可以切换到 root 上下文,方法是输入

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

或者省略 root ,直接输入 su ,默认也会切换到 root 上下文。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这时会提示你输入 root 的密码,但这个密码现在是随机的,你并不知道它是什么。

所以,我们要为 root 设置一个密码,输入

sudo passwd root

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

现在,你先要输入你的密码,就是刚刚初始化 Ubuntu 时你输入的那个密码。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

现在你可以为 root 设置密码了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

你还要确认一次密码。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

现在,root 的密码就设置完成了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

输入 su 后,输入刚刚设定的 root 密码,就可以切换到 root 上下文了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这个时候,你会发现,工作目录后面的 $ 符号已经变成 # 符号了,表示这是超级用户的上下文。

如何访问 Windows 目录和文件

这个 Linux 子系统的一个好处是可以直接访问 Windows 目录和文件,如果用于开发测试,比虚拟机方便很多。

访问Windows文件的一个最简单的方法,你可以在任何目录下执行 Powershell 或者 CMD,然后输入 bash 命令,就可以用当前目录来作为工作目录,并进入 Liunx 子系统。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

第二种方法,在 Linux 子系统中,通过 /mnt 下面的路径来访问。用过安卓模拟器的朋友应该知道这个目录。

举个例子,我要进入 D 盘下的 Apps 目录,可以输入

cd /mnt/d/apps

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

ls /mnt/c/Windows/System32

要注意大小写啊,而且路径分隔符要用 /。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

离线安装 .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% 就表示下载完了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

如果下载到半路挂了不动,你可以按【Ctrl + C】,然后它会重试继续下载,直到下载为止。如果实在不行,你可以在Windows中用迅雷等工具下,然后复制进Linux 目录就行了,复制用 cp 命令

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

现在 ls 一下,看看 tmp 目录下是不是有个压包。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

其实这个是不用安装的,直接解压出来就可以耍。

1、切换到你当前的目录下,输入 cd ~

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

2、用 mkdir 命令创建一个 dotnet 文件夹。

mkdir dotnet

然后用 cd 命令进入 /tmp,就是刚才下载文件存放的目录。

 cd /tmp

3、把刚刚下载的那个 tar.gz 包解压到 /home/你的用户名/dotnet 目录下。

tar -zxf dotnet-sdk-2.1.-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 命令看看里面是否有东西。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

然后,你可能会遇到这样的错误。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

不要急,这是缺少了某个库导致,执行以下命令安装一下:

sudo apt install libunwind8

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

接着,你再执行一下:

~/dotnet/dotnet --info

如果看到以下内容,那恭喜发财,你的 .net SDK 可以正常运行了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

但是,你也发现了,执行 dotnet 命令很是不方便,路径太长。这时候你一定会想到,设置一下 PATH 环境变量。老周个人觉得嘛,不轻易改动环境变量是最好的方案,我们输入以下命令,看看 PATH 变量中都有哪些路径。

echo $PATH

输出内容如下。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

于是,老周选择了 /home/zhou/bin,即 ~/bin。

用 cd ~ 切换到你的 home 目录下,然后 ls 一下,看看有没有 bin 目录。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

显然是没有的,所以,创建一个 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。

执行后,你就会看到备份的文件了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

接着,用 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

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

输完之后,按 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 ,更新源列表,这是必须的。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

从输出内容看到,微软的源也在其中了,但,你看清楚了,有这么一行。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这个错误是获取不到有效的签名,如果你按照官方的教程,先注册签名,是不会有此错误的,但因为此次并没有按官方的教程操作。

请把错误信息中 NO_PUBKEY 后面的那个字符串记下来,等一下会用到。

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

最后面那个字符串就是从错误信息中记下来的,执行上面这一条命令后,签名就被导入了。

然后你再执行一次 apt update。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这样就成功更新源了。

接着你可以通过以下命令,看一下跟 dotnet sdk 有关的 package。

apt list | grep dotnet-sdk-*

上面命令中有个管道符号(|),它会把前一条命令的执行结果传递到第二条命令。apt list 命令用来获取 source list 中查询到的软件包,然后列出来。列出来的软件包列表就传给 grep 命令,grep 命令可以使用正则表达式来查找内容,此处咱们匹配所有以 dotnet-sdk- 开头的包。

过滤后的结果如下图所示。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

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

安装软件包,使用 apt install <包名称>。咱们安装 2.1.4。

sudo apt install dotnet-sdk-2.1.

如果你不执行 su 切换到 root 上下文,就要加上 sudo ,否则是没有权限安装的。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这时候它提示你,连同 SDK 一起安装的一堆软件包,并告诉你可能要占用 300 多MB的空间,然后问你是否安装。

如果你要安装,就输入 y 并回车,如果不想安装就输入 n 并回车。都走到这一步了,当然是要安装的了。

随后你就慢慢等吧,等它安装完成。

测试运行

启动 VS ,新建一个 ASP.NET Core 项目,假设项目名字叫做 MyApp。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

然后让你选一个模板,对于 ASP.NET Core 项目,其实你选哪个模板都行,像什么 MVC ,什么 Web API,全部都是可以通过代码来开启,都是集成的,所以我说它比传统的 asp.net 要简单。

这里只为了验证,所以只选“空”模板就可以了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

等项目创建后,打开 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 很灵活,很多功能你都可以随意增减。

在“解决方案资源管理”器窗口中,在项目节点上右击,从弹出的菜单中选择【发布】。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

选择发布到文件夹。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

发布后,打开发布目录,如下图所示。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

然后以这个目录为工作目录,打开 Power shell 或CMD。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

输入 bash 命令进入 Linux 子系统。输入:

dotnet MyApp.dll

注意文件名是区分大小写的。

看到以下信息,就说明 asp.net core 应用已经运行起来了。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

打开浏览器,输入 http://localhost:7000,看看效果。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

这时候你发现是乱码,可能你会想到在 Response.WriteAsync 方法调用时加上 Encoding 参数。

其实问题不是出在这里,而是出在 content-type 头上,所以,你应该加上:

            app.Run(async (context) =>
{
context.Response.ContentType = "text/plain;charset=utf-8";
await context.Response.WriteAsync("这是一个很强大的应用。");
});

重新发布一下。然后再次从浏览器访问,如下图所示。

【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

好了,今天的内容就说到这里了,下一篇,老周介绍一下如何配置 nginx 服务器。

上一篇:【Vijos】lxhgww的奇思妙想(长链剖分)


下一篇:ERROR 2013 (HY000): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 2