从控制台应用程序引用的静态文件不适用于AspNetCore Web应用程序

问题描述

我希望能够从控制台应用程序启动AspNetCore Web应用程序。

运行网络应用程序时,静态文件可以正常加载

enter image description here

我在控制台应用程序中引用了该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文件夹添加到控制台应用程序输出中,但是网站静态文件仍未加载。

enter image description here

解决方法

您看到的问题是,当您使用其他应用程序启动虚拟主机时,它是使用其他应用程序的根目录。因此,这是正常启动服务:

webhost

此处是使用控制台应用程序启动的:

console

所以发生了什么事,当您将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步:运行!

这时我们应该是100%: finished

,

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

除非明确告知不要,否则所有Asp.Net Core Web应用程序都是控制台应用程序,它们在其中运行Kesterl作为Web服务器。

仍不清楚为什么要这样做,而只是在命令行上运行dotnet来运行应用程序,您将获得运行Web服务器的控制台应用程序。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...