因为.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,找到 "Microsoft.NETCore.App": "1.1.0",,修改为:
"Microsoft.NETCore.App": {
"version": "1.1.0",
"type": "platform"
},
保存,运行,通过,哦了,搞定。
本文作者:老徐
本文链接:https://bigger.ee/archives/13.html
转载时须注明出处及本声明