带有参数的 Blazor 服务器页面在手动刷新时抛出“404 not found”

Blazor server page with parameters throwing "404 not found " on manual refreshes

我有一个 Blazor Server 应用程序,其页面在 uri 中接收参数。当我单击具有路由设置的锚标记以使用参数(如下所示)访问该页面时,link 工作正常,页面加载。

<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>

但是,如果尝试从 url 直接访问页面,或在浏览器中手动刷新,则页面不会重新初始化或在参数上设置任何断点。相反,它会抛出 404 未找到。

这里有两件事:

Razor 和 Razor.cs 相关页面:

@page "/MyPage/{Param1}/{Param2}"

<h1>MyPage</h1>

<Metrics Param1="@Param1" />

<Details Param1="@Param1" Param2="@Param2" />

<InProgress Param1="@Param1" Param2="@Param2" />

<InQueue Param1="@Param1" />

<br />
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Components;
using MyApp.Data.Models.ApiResponse;

namespace MyApp.Pages
{
    public partial class MyPage
    {
        [Parameter]
        public string Param1 { get; set; }

        [Parameter]
        public string Param2{ get; set; }

        public TaskList Tasks { get; set; }

        protected override Task OnInitializedAsync()
        {
            // work in progress, intend to do more here later on
            var test = "";
            return base.OnInitializedAsync();
        }
    }
}

编辑 -- 根据评论建议

Startup.cs 中 Configure 方法的 UseEndpoints 部分:

 app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

进一步挖掘后,我注意到 @param2 偶尔会有一个 . 字符。 Blazor 确实需要配置具有 params with dots in them 的路由。以下回退不起作用:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/MyPage");

它抛出一个: InvalidOperationException: Cannot find the fallback endpoint specified by route values: { page: /MyPage, area: }.

我猜 area: 为空是个问题,但我找不到正确设置它的方法或位置。 link 中的示例仅显示后备页面的名称。有人可以指出这种回退有什么问题以及如何正确纠正它吗?

我的问题是参数值中有一个点字符。当路由问题来自参数中的“点”时,完全按照 docs 的建议进行操作(见图)。您需要像这样为该特定路由指定回退:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/_Host");

对于 WASM 项目:您想要指定 html 文件与 _Host,它应该是特定于 Blazor 服务器的。

endpoints.MapFallbackToFile("/MyPage/{Param1}/{Param2}", "index.html");

应用此设置后,刷新页面或直接到达 URL 应该会导致您的应用程序按预期工作,不再有 404 错误不同于 App.razor.

要点:

  • 检查您的 url 参数是否有任何已知的解析异常,例如点(Blazor 假设这些是被请求的文件)
  • 使用您的应用程序的默认页面作为回退,而不是您要点击的页面。在服务器应用程序中,wasm _Hostindex.html