4

我在 ASP.NET Core (v3.1) 应用程序使用的 razor 类库 (.net Core 3.1) 中实现静态文件时遇到困难。

尝试访问静态文件时,我只得到 404 - Not Found。

我在 Stackoverflow 上遵循以下答案:https ://stackoverflow.com/a/57874357/1099519或

我还与以下文档进行了交叉检查:https ://docs.microsoft.com/en-us/aspnet/core/razor-pages/ui-class?view=aspnetcore-3.0&tabs=visual-studio#create-an -rcl-with-static-assets

我在库中的以下位置放置了一个 css 文件: wwwroot\css\Base.css并测试了以下路径:https://localhost:44300/_content/OurIt.Cockpit/css/Base.css,这会导致 404 Not found 响应。

我已经检查过的内容:

  • 可以浏览任何在 RCL 中具有其视图的控制器并且它们工作正常(渲染的 HTML 代码提供给浏览器)
  • app.UseStaticFiles();Web 应用程序中。
  • webBuilder.UseStaticWebAssets();Web 应用程序中。
  • 正确的外壳。
  • Build Actionwwwroot\css\Base.css设置为Content
  • RCL 项目定义了以下 sdk:<Project Sdk="Microsoft.NET.Sdk.Razor">.
  • 在 RCL 项目中设置了以下属性:

    <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AddRazorSupportForMvc>true</AddRazorSupportForMvc> <PropertyGroup>

我还尝试了此答案中描述的方式:https://stackoverflow.com/a/59574845/1099519我尝试从https://localhost:44300/path/css/Base.css访问文件

有没有机会调试或定位问题?参考 Microsoft 文档:

构建 RCL 时,会生成一个描述静态 Web 资产位置的清单。使用应用程序在运行时读取清单以使用来自引用的项目和包的资产。

为了验证文件是否在程序集中,我试图找到该清单,但我找不到它或不知道在哪里寻找它(我检查了输出文件夹)。我还尝试用 ILSpy 打开 RCL,希望能找到解决问题的方法。

有什么想法(或带有 .NET Core 3.1 的静态内容的 RCL 的工作示例 - 我只找到了控制器 / 视图的示例,但没有找到静态内容的示例)?

2020 年 2 月 5 日更新:

我在 Github 上创建了一个示例进行复制: https ://github.com/DominikAmon/RclIssueDemo

4

5 回答 5

4

我终于让它为我工作了。我已对您在https://github.com/dotnet/AspNetCore.Docs/issues/16837创建的问题添加了评论。

我现在工作的 .csproj 的相关部分是:

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
    <GenerateMvcApplicationPartsAssemblyAttributes>true</GenerateMvcApplicationPartsAssemblyAttributes>
    <RazorCompileOnBuild>true</RazorCompileOnBuild>
    <IncludeRazorContentInPack>false</IncludeRazorContentInPack>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
    <EnableDefaultRazorGenerateItems>true</EnableDefaultRazorGenerateItems>
  </PropertyGroup>

 <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />
  </ItemGroup>

  <PropertyGroup>
    <StaticWebAssetBasePath Condition="$(StaticWebAssetBasePath) == ''">/</StaticWebAssetBasePath>
  </PropertyGroup>
</Project>

也许不是上面所有这些设置都是必需的,但是由于它正在工作,我不想过多地触摸它 -如果它有效,请不要触摸:-)

现在,这里还有其他问题:

  • 因为我想在本地测试我的 NuGet 包,所以我想首先将包推送到本地存储库文件夹,以便我可以从测试应用程序中使用它们。但是,没有记录 dotnet nuget 也可以推送到本地目录,所以我想我必须使用独立的 nuget.exe 来实现这一点。好吧,显然将 nuget.exe 与 RCL 库一起使用并不是一个好主意。相反,您可以使用:
dotnet nuget push .\bin\Release\DynamicVML.1.0.32.nupkg -s c:\Projects\nuget

(注意 -s 选项server URL文档中被描述为 a但它实际上可以是本地文件夹,这里没有解释)

  • 周围有很多过时的文章和 StackOverflow 答案可能会让您走上错误的道路。发生在我身上的是,在某些时候,我试图遵循来自不同来源的教程,这些教程对于 .NET Core 3.1 来说已经过时了。我最终弄乱了一些我的项目文件并且忘记了撤消我所做的一些更改。为了让这一切正常工作,请确保:

  • 视图/.cshtml 文件必须设置为“构建操作:内容”;

  • 静态文件/js文件必须设置为“Build Action: Content”;

现在,到消费者应用程序部分:

  • 我不需要webBuilder.UseStaticWebAssets();像我想的那样添加 Program.cs。所以我的 CreateHostBuilder 看起来像这样:
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

我不必添加过时教程中描述的任何 FileProvider 功能。我的 ConfigureServices 就像这样干净:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseInMemoryDatabase("BookAuthors"));
}

我的配置只是基线之一:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

通过上述设置,一切正常。我可以包含 RCL 库中的 js 文件,即使它们实际上并不存在于消费者项目 wwwroot中(我知道这已记录在当前文档中,但在某些时候我试图通过将UseDirectoryBrowser 添加到我的配置和检查服务文件夹的内容 - 这不起作用,来自 RCL 的静态文件不会显示)。

另外,对于其他有类似问题的人的说明:使用上述设置(由于最后一个配置块,更具体地说)我可以使用来自/. 我没有使用/_content/LibraryName/...路径。在我的 RCL 中,我有以下结构

- wwwroot
---- lib
------- myFolder
---------- myScript.js

从消费者应用程序中,我只需使用 .js 文件

@section Scripts {
    <script src="~/lib/myFolder/myScript.js"></script>
}

......它的工作原理!

于 2020-05-09T06:11:09.270 回答
1

我按照这篇文章,它运作良好。 https://dev.to/j_sakamoto/how-to-deal-with-the-http-404-content-foo-bar-css-not-found-when-using-razor-component-package-on-asp- net-core-blazor-app-aai

在 Program.cs 添加 StaticWebAssetsLoader 以包含静态文件,它能够在 Razor 库类中加载 css 和 javascript

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.ConfigureAppConfiguration((ctx, cb) =>
                    {
                        StaticWebAssetsLoader.UseStaticWebAssets(
                          ctx.HostingEnvironment,
                          ctx.Configuration);
                    });
                });
于 2020-12-15T09:10:10.603 回答
1

如果您从 RclDemo.Library 项目中删除对 Microsoft.AspNet.Core 的引用,那么一切都会按预期工作。这是应该从项目文件中删除的行:

<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />

如果您创建新的 .NET Core 3.x 应用程序,则不会包含此参考,因为它现在包含在 Microsoft.AspNetCore.App 框架参考中。静态文件在 .NET Core 2.2 Razor 类库中的工作方式不同,我认为您包含 Microsoft.AspNetCore.Mvc v2.2.0 库正在破坏事情。曾经有额外的配置来在 RCL 中包含静态文件。

肖恩

于 2020-03-18T12:54:30.897 回答
1

我查看了您的 github 示例并修复了它。我删除了RclDemo.Library.csproj. 不知道你的整个项目是否需要这些,但至少你可以找出你是否需要它们,或者你是否需要为它们配置一些东西。

代码:


    <Project Sdk="Microsoft.NET.Sdk.Razor">
        <PropertyGroup>
            <TargetFramework>netcoreapp3.1</TargetFramework>
            <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
        </PropertyGroup>
        <ItemGroup>
            <!--<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
            <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="3.1.1" />-->
            <FrameworkReference Include="Microsoft.AspNetCore.App" />
        </ItemGroup>
    </Project>

于 2020-06-08T14:18:35.923 回答
0

我正在使用带有对我的 RCL 的项目引用的普通 Blazor Server 模板。没有任何额外的代码,一切都运行良好。

我添加 Nuget 包属性后出现了我的问题。包 ID 与程序集名称不同。

在这种模式下:

_content/{LIBRARY NAME}/ 程序集名称 = 库名称。

添加 Nuget 属性 PackageId = 库名称后

希望这对其他人有帮助。

于 2021-04-19T11:09:47.240 回答