【问题标题】:Static files not working for AspNetCore web app when referenced from Console App从控制台应用程序引用时,静态文件不适用于 AspNetCore Web 应用程序
【发布时间】:2020-12-14 14:52:47
【问题描述】:

我希望能够从控制台应用程序启动 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 文件夹添加到控制台应用程序输出,但网站静态文件仍未加载。

【问题讨论】:

  • 一种解决方案是将 Web 应用程序作为单独的进程运行 System.Diagnostics.Process.Start("ExterrnalLoginTest.exe");

标签: c# asp.net-core .net-core console-application kestrel-http-server


【解决方案1】:

您看到的问题是,当您使用其他应用程序启动虚拟主机时,它使用其他应用程序的位置作为它的根。所以,这里是正常启动服务:

这里是使用控制台应用程序启动它:

所以发生的情况是,当您将ExternalLoginTest 作为依赖项添加到SelfHostedConsoleApp 时,编译器现在移动 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%:

【讨论】:

  • 想知道是否有办法不必手动包含每个 cshtml 页面
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多