.Net Core系列教程(二)——细数.Net Core 1.1的坑

@老徐  November 5, 2016

因为.net core我也是边学边用,会时不时的遇到些比较坑人的地方,会不定期的在这里更新,同时给出脱坑方法。目前有如下这些坑:

1.如果开发环境没有安装.Net Core 1.1,而服务器上是.Net Core 1.1的环境,那么。。。你的程序在服务器上跑不起来,向下不兼容,要问怎么解决,打开你的工程,打开nuget,更新,把里面的全都更新了,之后再重新编译部署就可以了。

2.按照官网文档https://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction进行部署,到使用systemd来管理.net core站点启动这一步的时候,无论你怎么操作都是不会像官方那样成功的,而是会报500错误,而直接使用dotnet命令来运行的时候又没问题,使用journalctl 命令来看日志,会看到这些:

    root@biz126:/home/wwwroot/netcore/domain/tool.dwz.nz/web# journalctl -fu kestrel-dwztool.service
    -- Logs begin at Fri 2016-11-18 12:10:41 CST. --
    Nov 19 22:19:04 biz126 dotnet-tooldwznz[14275]: Application started. Press Ctrl+C to shut down.
    Nov 19 22:51:46 biz126 systemd[1]: Stopping tool.dwz.nz website...
    Nov 19 22:51:46 biz126 dotnet-tooldwznz[14275]: Application is shutting down...
    Nov 19 22:51:47 biz126 systemd[1]: Stopped tool.dwz.nz website.
    Nov 19 22:53:05 biz126 systemd[1]: Starting tool.dwz.nz website...
    Nov 19 22:53:05 biz126 systemd[1]: Started tool.dwz.nz website.
    Nov 19 22:53:06 biz126 dotnet-tooldwznz[17468]: Hosting environment: Production
    Nov 19 22:53:06 biz126 dotnet-tooldwznz[17468]: Content root path: /
    Nov 19 22:53:06 biz126 dotnet-tooldwznz[17468]: Now listening on: http://localhost:5000
    Nov 19 22:53:06 biz126 dotnet-tooldwznz[17468]: Application started. Press Ctrl+C to shut down.

从日志中的“Content root path: /”可以看到,把/文件夹作为了站点的根目录了,解决方法:打开Program.cs文件,添加using System.Reflection;,之后注释掉原来的.UseContentRoot(Directory.GetCurrentDirectory()),添加新的.UseContentRoot(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)),再重新编译发布部署,就可以了

如果要在VS中调试的话,还要再改回去。

3.如果你所有的步骤都是按照官方文档进行,安装的时候:

    sudo apt-get install curl libunwind8 gettext
    curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=835021
    sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet
    sudo ln -s /opt/dotnet/dotnet /usr/local/bin

设置守护进程:

        [Unit]
        Description=Example .NET Web API Application running on Ubuntu

        [Service]
        ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
        Restart=always
        RestartSec=10                                          # Restart service after 10 seconds if dotnet service crashes
        SyslogIdentifier=dotnet-example
        User=www-data
        Environment=ASPNETCORE_ENVIRONMENT=Production 

        [Install]
        WantedBy=multi-user.target

.Net Core 2.0.7 使用的systemctl配置如下:

[Unit]
Description=Example .NET Web API App running on Ubuntu

[Service]
WorkingDirectory=/var/aspnetcore/hellomvc
ExecStart=/usr/bin/dotnet /var/aspnetcore/hellomvc/hellomvc.dll
Restart=always
RestartSec=10  # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

启用服务:

    systemctl enable kestrel-hellomvc.service

启动服务:

        systemctl start kestrel-hellomvc.service
        systemctl status kestrel-hellomvc.service

你会发现,真是日了卵,http://localhost:5000无法访问,查日志:

    journalctl -fu kestrel-hellomvc.service

泥煤的,果然是有问题,站点没跑起来,什么原因呢?

问题就在这里(此处应有柯南):

安装的时候,dotnet的环境变量添加在/usr/local/bin里,而守护进程的服务设置的却是/usr/bin/dotnet,能好用才见鬼,把守护进程中的/usr/bin/dotnet换成/usr/local/bin/dotnet就好了,我也在本系列中的第一篇文章《.Net Core系列教程(一)——环境搭建》中提到过。

4.创建Web项目,之后运行,咦?不按套路出牌,默认的项目竟然直接报一大堆错,像什么

Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'

1.The project has not been restored or restore failed - run dotnet restore

2.The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section.

3.You may be trying to publish a library, which is not supported. Use dotnet pack to distribute libraries.

而报错文件全都指向.net core的C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets文件的第262行,???一脸黑人问号。

报的错如下图:

我可是什么也没干啊,而且这报的还不是哪个代码的错误,这是哪里出了问题呢?这个也是从1.0升级为1.1之后出现的问题,解决办法(敲黑板,划重点):

打开项目的配置文件project.json,找到 <span style="background-color: #D8D8D8;"> "Microsoft.NETCore.App": "1.1.0</span>",,修改为:

    "Microsoft.NETCore.App": {
        "version": "1.1.0",
        "type": "platform"
    },

保存,运行,通过,哦了,搞定。


添加新评论