在.Net Core 2.x中使用Microsoft.AspNetCore.Hosting.WindowsServices

时间:2018-08-13 11:37:59

标签: c# .net asp.net-core .net-core

我正尝试使用Windows服务来托管针对.Net core 2.x的简单ASP.Net Core Web应用,如Microsoft的here所述。

这对于文档来说应该很简单,但是我却一无所获,因为Microsoft.AspNetCore.Hosting.WindowsServices软件包似乎不适用于任何版本的.Net Core(NuGet页面表示它取决于.Net Standard) 。简单地打开一个项目将导致Visual Studio陷入NuGet还原,而没有任何错误消息(我必须手动终止VS进程,因为关闭VS会导致它停止响应)。从命令运行dotnet restore将导致cmd卡在“为XXX还原软件包”中。

ASP.Net官方文档中的sample code也会发生同样的事情。我想这肯定对我来说是特定于计算机或平台的问题,但是我尝试使用各种(新)VM,但没有想法。到目前为止,唯一有效的方法是this answer here,即以.Net Framework为目标并显式列出所有程序包引用,而不是使用Microsoft.AspNetCore.All。

我正在使用VS2017 15.7.6。在这个问题上的任何帮助将不胜感激!

更新

在VS2017中安装Azure开发工作负载后,问题神奇地消失了。之前我已经有ASP.Net和.Net Core工作负载,所以我真的不知道哪个组件可以解决问题,但确实可以解决问题。

2 个答案:

答案 0 :(得分:1)

是的,这个answer是正确的。 windows-service package仅在Windows上运行。您必须直接定位所需的每个程序包,因为Microsoft.AspNetCore.App(.NET-Core> = 2.1)和Microsoft.AspNetCore.All(.NET-Core> = 1.1 <= 2.0)程序包都包含程序包)定位到.NET-Core而不是.NET-Standard。

您可以使用来定位两个框架

<TargetFrameworks>net471;netcoreapp2.1</TargetFrameworks>

,并且在您的项目文件中有条件包含+ c#代码中的编译器指令。

<!-- CSPROJ CONDITIONAL REFERENCE -->
<PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.1.1" Condition="'$(TargetFramework)' == 'net471'" />

// c#-code compiler directive
#if net471
using Microsoft.AspNetCore.Hosting.WindowsServices;
#endif

请记住,使用完整的.NET-Framework将使您失去.NET-Core引入的性能改进。

我确定您还可以通过一个批处理脚本/ Windows任务来在每次Windows计算机重新启动时启动.NET-Core服务。

答案 1 :(得分:0)

我也有类似的问题。我们有多个Nuget套件商店,其中之一正在遇到证书问题。

我通过以下操作对其进行了修复:

  1. 在解决方案资源管理器中右键单击项目依赖项,然后单击管理Nuget程序包

  2. 在程序包管理器的“ 已安装”选项卡中,您应该看到该程序包,选择Microsoft.AspNetCore.Hosting.WindowsServices程序包。它将显示版本0和一些指示,表明下载失败。

  3. 您可能还会在右上角看到 Package来源,指向其中一个自定义Nuget商店。将包来源更改为 ALL 。这将导致窗口刷新,然后您可能会看到正确的版本和“更新”按钮。

  4. 现在单击更新按钮进行更新。我的版本现在是2.1.1。

现在查看项目文件,它将包引用更改为:

<PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.1.1" />