从控制台应用程序引用时,静态文件不适用于 AspNetCore Web 应用程序
Static files not working for AspNetCore web app when referenced from Console App
我希望能够从控制台应用程序启动 AspNetCore Web 应用程序。
当 运行 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
时,编译器现在 将 ExternalLoginTest
模块移动到 SelfHostedConsoleApp
的目录基本上破坏了你的路径。
第一步:复制到 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>
这将创建一个符号 link 回到宿主项目中的 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>
如果我们现在 运行 它,它会 return 一个 404。但是,为了证明静态内容是有效的,尝试去 http://localhost:5000/favicon.ico
它会告诉你静态内容。
第 3 步:将您的剃刀页面添加为 Content
它现在 returning 404 的原因是因为 none 你的剃刀页面被标记为 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-click,right-click 并执行“属性”,然后在 属性 window 中更改 Build Action
至 Content
.
第 4 步:运行!
此时我们应该是 100%:
每个 .Net Core 应用程序都是控制台应用程序,除非您将其部署到网络服务器。
所有 Asp.Net 核心 Web 应用程序都是控制台应用程序,运行 Kesterl 作为 Web 服务器,除非明确告知不要这样做。
仍然不清楚为什么要这样做,但只需 运行 在命令行上使用 dotnet 运行 的应用程序,您将获得一个控制台应用程序 运行ning网络服务器。
我希望能够从控制台应用程序启动 AspNetCore Web 应用程序。
当 运行 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
时,编译器现在 将 ExternalLoginTest
模块移动到 SelfHostedConsoleApp
的目录基本上破坏了你的路径。
第一步:复制到 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>
这将创建一个符号 link 回到宿主项目中的 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>
如果我们现在 运行 它,它会 return 一个 404。但是,为了证明静态内容是有效的,尝试去 http://localhost:5000/favicon.ico
它会告诉你静态内容。
第 3 步:将您的剃刀页面添加为 Content
它现在 returning 404 的原因是因为 none 你的剃刀页面被标记为 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-click,right-click 并执行“属性”,然后在 属性 window 中更改 Build Action
至 Content
.
第 4 步:运行!
此时我们应该是 100%:
每个 .Net Core 应用程序都是控制台应用程序,除非您将其部署到网络服务器。
所有 Asp.Net 核心 Web 应用程序都是控制台应用程序,运行 Kesterl 作为 Web 服务器,除非明确告知不要这样做。
仍然不清楚为什么要这样做,但只需 运行 在命令行上使用 dotnet 运行 的应用程序,您将获得一个控制台应用程序 运行ning网络服务器。