问题描述
我希望能够从控制台应用程序启动AspNetCore Web应用程序。
运行网络应用程序时,静态文件可以正常加载
我在控制台应用程序中引用了该Web应用程序,并在控制台应用程序中添加了以下代码:
using System;
using System.Diagnostics;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace SelfHostedConsoleApp
{
class Program
{
static void Main(string[] args)
{
System.Threading.Tasks.Task.Run(() => ExterrnalLoginTest.Program.Main(null));
Console.WriteLine("Please enter any key to exit");
Console.ReadLine();
}
}
}
我也将它添加到了webb应用程序cproj中,没有运气:
<ItemGroup>
<Content Remove="wwwroot\**" />
</ItemGroup>
<ItemGroup>
<Content Include="wwwroot\**" CopyToPublishDirectory="PreserveNewest">
</Content>
</ItemGroup>
这确实将wwwroot文件夹添加到控制台应用程序输出中,但是网站静态文件仍未加载。
解决方法
您看到的问题是,当您使用其他应用程序启动虚拟主机时,它是使用其他应用程序的根目录。因此,这是正常启动服务:
此处是使用控制台应用程序启动的:
所以发生了什么事,当您将ExternalLoginTest
作为依赖项添加到SelfHostedConsoleApp
时,编译器现在将 moves ExternalLoginTest
模块放入SelfHostedConsoleApp
的目录实际上破坏了您的路径。
第1步:复制wwwroot目录
因此,这里的挑战是我们必须将wwwroot
移到新的目的地。我看到您在您的问题中尝试过此操作,但必须像这样:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Content Include="wwwroot\**" Link="wwwroot\%(RecursiveDir)%(Filename)%(Extension)"
CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
</Project>
这将创建一个指向宿主项目中wwwroot
目录的符号链接。
步骤2:将EnableDefaultContentItems选项设置为false
执行此操作时,您将看到各种错误以及有关将EnableDefaultContentItems
添加到false的一些信息。因此,让我们继续执行此操作:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<EnableDefaultContentItems>false</EnableDefaultContentItems>
</PropertyGroup>
<ItemGroup>
<Content Include="wwwroot\**" Link="wwwroot\%(RecursiveDir)%(Filename)%(Extension)"
CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
</Project>
如果我们现在运行它,它将返回一个404。但是,要证明静态内容有效,请尝试转到http://localhost:5000/favicon.ico
,它将向您显示静态内容。
步骤3:将您的剃须刀页面添加为Content
现在返回404的原因是因为您的剃刀页面均未标记为Content
,因此框架认为您没有要显示的页面。使用EnableDefaultContentItems
设置为false
的唯一主要缺点是我们必须手动将剃须刀页面添加到.csproj
文件中。 Visual Studio将不再为我们这样做。因此,现在您的项目文件将如下所示:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<EnableDefaultContentItems>false</EnableDefaultContentItems>
</PropertyGroup>
<ItemGroup>
<Content Include="wwwroot\**" Link="wwwroot\%(RecursiveDir)%(Filename)%(Extension)"
CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Content Include="Pages\Error.cshtml" />
<Content Include="Pages\Index.cshtml" />
<Content Include="Pages\Privacy.cshtml" />
<Content Include="Pages\Shared\_Layout.cshtml" />
<Content Include="Pages\Shared\_ValidationScriptsPartial.cshtml" />
<Content Include="Pages\_ViewImports.cshtml" />
<Content Include="Pages\_ViewStart.cshtml" />
</ItemGroup>
</Project>
执行此操作的快捷方式是按住Shift键并单击页面,右键单击并执行“属性”,然后在属性窗口中将Build Action
更改为Content
。
第4步:运行!
,每个.Net Core应用程序都是控制台应用程序,除非您将其部署到Web服务器。
除非明确告知不要,否则所有Asp.Net Core Web应用程序都是控制台应用程序,它们在其中运行Kesterl作为Web服务器。
仍不清楚为什么要这样做,而只是在命令行上运行dotnet来运行应用程序,您将获得运行Web服务器的控制台应用程序。