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

Cod*_*Lee 8 c# page-refresh blazor blazor-server-side

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

<a href="/MyPage/{@Param1}/{@Param2}"> <!--link content in here--> </a>
Run Code Online (Sandbox Code Playgroud)

但是,如果尝试直接从该 URL 访问该页面,或者在浏览器中手动刷新,则该页面不会重新初始化或命中参数上的任何断点。相反,它会抛出 404 not found。

所以这里有两件事:

  • 首先,我很困惑为什么它在锚标记内工作正常,但以其他方式消失。特别是当指令中没有参数的页面@page可以与刷新/直接网址一起正常工作时。
  • 其次,这是 Blazor Server 的预期行为还是我在这里遗漏了一些直接破坏页面刷新/点击 URL 的内容?看起来不像是一个功能,但也许我误解了 Blazor 的路由。

相关页面的 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 />
Run Code Online (Sandbox Code Playgroud)
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();
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

编辑——每个评论建议

Startup.cs 中配置方法的 UseEndpoints 部分:

 app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
Run Code Online (Sandbox Code Playgroud)

.经过进一步挖掘,我注意到 @param2中偶尔会有一个字符。Blazor 确实需要配置参数中带有点的路由。下面的回退不起作用:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/MyPage");
Run Code Online (Sandbox Code Playgroud)

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

我猜area:空是一个问题,但我没有找到如何或在哪里正确设置它。链接中的示例仅显示后备页面的名称。有人可以指出这种回退有什么问题以及如何正确纠正它吗?

Cod*_*Lee 9

我的问题是参数值中存在点字符。当路由问题是由于参数中的“点”引起时,那么完全按照文档建议的操作就可以解决问题(如图)。您将需要为该特定路线指定回退,如下所示:

endpoints.MapFallbackToPage("/MyPage/{Param1}/{Param2}", "/_Host");
Run Code Online (Sandbox Code Playgroud)

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

endpoints.MapFallbackToFile("/MyPage/{Param1}/{Param2}", "index.html");
Run Code Online (Sandbox Code Playgroud)

应用此设置后,刷新页面或直接访问 URL 应该会导致您的应用程序按预期工作,不再出现与标准<NotFound>标记设置不同的 404 错误。App.razor.

关键点:

  • 检查您的 url 参数是否有任何已知的解析异常,例如点(Blazor 假定这些是正在请求的文件)
  • 使用应用程序的默认页面进行回退,而不是您想要访问的页面。在用于 wasm的服务器应用程序中,_Host它是index.html

  • 非常感谢@CoderLee。提供的链接非常有帮助,我的案例也是参数中的一个点。所以我最终得到了: `endpoints.MapFallbackToPage("/{param1?}/{param2?}/{param3?}/{param4?}", "/_Host");` 就像一个魅力。 (2认同)