Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ubuntu16.04上使用systemD时,DotnetCore内容根路径正在更改_Ubuntu_Asp.net Core_Systemd_Kestrel Http Server_.net Core - Fatal编程技术网

在Ubuntu16.04上使用systemD时,DotnetCore内容根路径正在更改

在Ubuntu16.04上使用systemD时,DotnetCore内容根路径正在更改,ubuntu,asp.net-core,systemd,kestrel-http-server,.net-core,Ubuntu,Asp.net Core,Systemd,Kestrel Http Server,.net Core,我目前正试图通过以下教程在Azure上的Ubuntu16.04虚拟机上部署DotNetCore应用程序: 将dotnet publish生成的文件夹内容部署到vm后。。。。如果我手动进入项目文件夹并通过dotnet app_name.dll启动Kestrel,它工作正常,我可以从浏览器访问应用程序 手动运行dotnet app_name.dll后从终端获得的输出为 托管环境:生产环境 内容根路径:/home/myUser/publish 现在收听:http://localhost:5000 应

我目前正试图通过以下教程在Azure上的Ubuntu16.04虚拟机上部署DotNetCore应用程序:

dotnet publish
生成的文件夹内容部署到vm后。。。。如果我手动进入项目文件夹并通过
dotnet app_name.dll
启动Kestrel,它工作正常,我可以从浏览器访问应用程序

手动运行
dotnet app_name.dll
后从终端获得的输出为

托管环境:生产环境
内容根路径:/home/myUser/publish
现在收听:http://localhost:5000
应用程序已启动。按Ctrl+C关闭。

现在,教程希望我使用SystemD来管理Kestrel流程

它通过为我们运行
dotnet
ExecStart=/usr/bin/dotnet/var/aspnetcore/app_name.dll
。在服务文件中

当我启动这项服务时,它看起来会起作用。我得到:

托管环境:生产环境
内容根路径:/
现在收听:http://localhost:5000
应用程序已启动。按Ctrl+C关闭。

。。。但当我尝试访问应用程序时,kestrel从未收到请求。我所看到的两者之间的唯一区别是
内容根路径

现在,在项目中,路径在startup.cs中引用:

公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath…

我尝试硬编码字符串值,但实际上没有改变任何东西

那么,是我的web应用程序无法在
内容根路径下工作的罪魁祸首吗

如果是,我如何解决这个问题?
如果没有,是否还有其他问题需要注意?

在新建WebHostBuilder时是否正在调用
.UseContentRoot(Directory.GetCurrentDirectory())

如果是这样,当从
systemd
调用它时,这将不起作用。您会发现,如果删除该行,它将获得正确的ContentRoot

编辑:

补充回答:是的,您可以在
systemd
config中指定WorkingDirectory作为替代解决方案。您需要做的事情取决于您的特定需求和环境

请记住:

如果未设置WorkingDirectory,则“当systemd作为系统实例运行时,默认为根目录;如果作为用户运行,则默认为相应用户的主目录。”

如果设置了WorkingDirectory但未设置RootDirectory”,则WorkingDirectory=相对于运行服务管理器的系统的根


“请注意,设置此参数可能会导致向设备添加其他依赖项。”(例如现有目录)

问题在于
目录.CurrentDirectory()
返回运行
dotnet
命令的目录。解决此问题的最简单方法是通过添加以下行来修改systemd配置文件:

 WorkingDirectory=/var/aspnetcore

这将更改执行
dotnet
命令的目录。这样,您就不必更改项目的代码,它在本地计算机上的工作方式与在远程计算机上的工作方式相同。

您的应用程序的服务文件可能如下所示:

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

[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=your-user-name
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target
您必须在“User=”行中指定用户名,并且您应该对项目目录(如/var/www/example)具有完全权限。如果您不添加用户行或不更改,系统将不会执行您的服务

要获取目录的权限,请执行以下操作:

sudo chown -R <user>:<user-group> /var/www/<your-app>
sudo setfacl -R -d -m u:<user>:rwx,g:<user-group>:rwx,o::r /var/www/<your-app>
sudo chown-R:/var/www/
sudosetfacl-R-d-mu::rwx,g::rwx,o::R/var/www/

如果您注意我所说的,您的服务将毫无问题地运行。

删除后,停止在我的本地服务器上运行。尽管如此。UseContentRoot(Environment.GetEnvironmentVariable(“ASPNETCORE_Environment”)==“Production”?Path.GetDirectoryName(Assembly.GetEntryAssembly().Location):Directory.GetCurrentDirectory())谢谢……我看了几个小时,直到看到显示“www数据”的另一个“示例”中的问题。非常感谢。不客气:)我很高兴你解决了这个问题。