asp.net systemd 服务在使用 .net 3.1 时卡住了

asp.net systemd service stuck using .net 3.1

我正在尝试设置 systemd 服务以在 raspberry pi 上托管网站。我安装了 ubuntu 20.04 并一直在尝试获取我的服务 运行 但发现它没有启动,因为它似乎找不到 aspnetcore 3.1 运行时。问题是,我不想使用 3.1 并且确实安装了 5.0。以下是我使用代码得到的消息:

 journalctl -u   BuildItWithDan.service

Mar 07 14:02:22 ubuntu systemd[1]: BuildItWithDan.service: Main process exited, code=exited, status=150/n/a
Mar 07 14:02:22 ubuntu systemd[1]: BuildItWithDan.service: Failed with result 'exit-code'.
Mar 07 14:02:33 ubuntu systemd[1]: BuildItWithDan.service: Scheduled restart job, restart counter is at 328.
Mar 07 14:02:33 ubuntu systemd[1]: Stopped Running ASP.NET Core on Ubuntu 20.04 Webserver APACHE.
Mar 07 14:02:33 ubuntu systemd[1]: Started Running ASP.NET Core on Ubuntu 20.04 Webserver APACHE.
Mar 07 14:02:33 ubuntu dotnet-example[7219]: It was not possible to find any compatible framework version
Mar 07 14:02:33 ubuntu dotnet-example[7219]: The framework 'Microsoft.AspNetCore.App', version '3.1.0' was not found.
Mar 07 14:02:33 ubuntu dotnet-example[7219]:   - The following frameworks were found:
Mar 07 14:02:33 ubuntu dotnet-example[7219]:       5.0.3 at [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Mar 07 14:02:33 ubuntu dotnet-example[7219]: You can resolve the problem by installing the specified framework and/or SDK.
Mar 07 14:02:33 ubuntu dotnet-example[7219]: The specified framework can be found at:
Mar 07 14:02:33 ubuntu dotnet-example[7219]:   - https://aka.ms/dotnet-core-applaunch framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=arm64&rid=ubuntu.20.04-arm64
Mar 07 14:02:33 ubuntu systemd[1]: BuildItWithDan.service: Main process exited, code=exited, status=150/n/a
Mar 07 14:02:33 ubuntu systemd[1]: BuildItWithDan.service: Failed with result 'exit-code'.

这是我的服务代码:

[Unit]
Description=Running ASP.NET Core on Ubuntu 20.04 Webserver APACHE

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

[Install]
WantedBy=multi-user.target

并安装了我的 dot-net 版本。

dotnet --info

.NET SDK (reflecting any global.json):
 Version:   5.0.200
 Commit:    70b3e65d53

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  20.04
 OS Platform: Linux
 RID:         ubuntu.20.04-arm64
 Base Path:   /usr/share/dotnet/sdk/5.0.200/

Host (useful for support):
  Version: 5.0.3
  Commit:  c636bbdc8a

.NET SDKs installed:
  5.0.200 [/usr/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.3 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

关于此服务为何不使用已安装的 .net 5 运行时的任何想法?

我猜您的应用程序是作为依赖于框架的应用程序部署的。这意味着它假定框架 ASP.NET Core 3.1.0 已经安装在目标机器上。您可以通过以下方式解决该问题:

  1. 正在安装 .NET Core 3 运行时(使用 ASP.NET 核心)
  2. 将应用程序发布为独立的(包含框架)
  3. 使用 .NET 5 作为目标平台发布应用程序并使其依赖于框架。

如果您有权访问源代码,则可以使用选项 2 和 3。

有关各种部署方法的更多详细信息,您可以在文档页面上找到:https://docs.microsoft.com/en-us/dotnet/core/deploying/

警告:我没有在干净的环境中尝试下面的方法,所以我不能 100% 确定它是否有效(在更改任何内容之前进行备份)。

您也可以使用某种方式 'hack' 并尝试编辑文件 [application_name].runtimeconfig.json。它的内容如下:

{
  "runtimeOptions": {
    "tfm": "netcoreapp3.1",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "3.1.0"
    }
  }
}

你可以尝试改成:

{
  "runtimeOptions": {
    "tfm": "net5.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "5.0.0"
    }
  }
}

您还必须找到一个文件 [application_name].deps.json 并更改所有出现的内容:

.NETCoreApp,Version=v3.1

至:

.NETCoreApp,Version=v5.0

我找到了答案。

在我的服务中有这条线

ExecStart= /usr/bin/dotnet /var/www/BuildItWithDan/BuildItWithDan.dll

当它应该只是

ExecStart= dotnet /var/www/BuildItWithDan/BuildItWithDan.dll

基本上,调用 'dotnet' 而不是给它一个路径。愚蠢的错误。