从控制台应用程序引用时,静态文件不适用于 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 ActionContent.

第 4 步:运行!

此时我们应该是 100%:

每个 .Net Core 应用程序都是控制台应用程序,除非您将其部署到网络服务器。

所有 Asp.Net 核心 Web 应用程序都是控制台应用程序,运行 Kesterl 作为 Web 服务器,除非明确告知不要这样做。

仍然不清楚为什么要这样做,但只需 运行 在命令行上使用 dotnet 运行 的应用程序,您将获得一个控制台应用程序 运行ning网络服务器。