Blazor WASM(托管)在手动输入的 URL 上重定向

Blazor WASM (hosted) redirected on manually entered URL

提问人:Sascha Heimann 提问时间:8/14/2022 最后编辑:zx485Sascha Heimann 更新时间:8/18/2022 访问量:332

问:

我有一个 Blazor WASM(托管)应用程序。一切正常。除非我手动输入页面的 URL。

例如。我有一个页面“RsetPw2.razor”。
代码如下:

@page "/Auth/respw2"
@using Microsoft.AspNetCore.WebUtilities
@using Microsoft.Extensions.Primitives;
@layout AccountLayout
@inject IAuthService AuthService
@inject ISnackbar Snackbar
@inject NavigationManager navMgr


@if (usTok == null || usEm == null)
{
    <MudContainer>
        <MudCard style="margin-top:60px; width:80%;" Elevation="5" Class="pa-auto ml-auto mr-auto">
            <MudCardHeader>
                <MudText Typo="Typo.h5">Reset your Password (step two)</MudText>
            </MudCardHeader>
            <MudCardContent>
                <MudAlert Severity="Severity.Error" Variant="Variant.Filled">This page can not be called without a valid token and a valid user email address!</MudAlert>
            </MudCardContent>
            <MudCardActions>
                <MudButton ButtonType="ButtonType.Submit" Disabled="true" Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto">Register</MudButton>
            </MudCardActions>
        </MudCard>
    </MudContainer>
}
else
{
    <EditForm Model="@user" OnValidSubmit="@HandleReset">
        <DataAnnotationsValidator />
        <MudCard style="margin-top:60px; width:80%;" Elevation="5" Class="pa-auto ml-auto mr-auto">
            <MudCardHeader>
                <MudText Typo="Typo.h5">Reset your Password</MudText>
            </MudCardHeader>
            <MudCardContent>
                <MudTextField Label="Email address" Disabled="true" HelperText="Max. 8 characters" @bind-Value="@usEm" For="@(() => user.UserEmail)" />
                <MudTextField Label="Reset token" Disabled="true" Class="mt-3" HelperText="the token you'vet got by mail'" @bind-Value="@usTok" For="@(() => user.ResetToken)" />
                <MudTextField Label="New Password" HelperText="Choose a strong password" Class="mt-3" @bind-Value="@user.NewPassword" For="@(() => user.NewPassword)" InputType="InputType.Password" />
                <MudTextField Label="repeat new Password" HelperText="Repeat the password" Class="mt-3" @bind-Value="@user.ConfirmPassword" For="@(() => user.ConfirmPassword)" InputType="InputType.Password" />
            </MudCardContent>
            <MudCardActions>
                <MudButton ButtonType="ButtonType.Submit" Variant="Variant.Filled" Color="Color.Primary" Class="ml-auto">Reset Password</MudButton>
            </MudCardActions>
        </MudCard>

    </EditForm>

}

@code {
private UserPwResetModel user = new UserPwResetModel();
private StringValues tok = String.Empty;
private StringValues em = String.Empty;
private string usTok { get; set; } = String.Empty;
private string usEm { get; set; } = String.Empty;

protected override void OnInitialized()
{
    var uri = navMgr.ToAbsoluteUri(navMgr.Uri);
    if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("token", out tok))
    {
        usTok = Convert.ToString(tok);
    }
    if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("um", out em))
    {
        usEm = Convert.ToString(em);
    }
}

private async Task HandleReset()
{
    user.ResetToken = usTok;
    user.UserEmail = usEm;
    var res = await AuthService.ResetPassword(user);
    if (!res.Success)
    {
        snackMessage(res.Message, Severity.Error, Defaults.Classes.Position.BottomRight);
    }
    else
    {
        snackMessage(res.Message, Severity.Success, Defaults.Classes.Position.BottomRight);
        var Count = 3;
        var tmr = new System.Threading.Timer(new TimerCallback(_ =>
        {
            if (Count > 0)
            {
                Count--;                    
            }
            if(Count == 0)
            {
                Snackbar.Clear();
                navMgr.NavigateTo("/Auth/login");
            }
        }), null, 1000, 1000);
    }
}

// show a snackbar message
private void snackMessage(string message, MudBlazor.Severity type, string position)
{
    Snackbar.Clear();
    Snackbar.Configuration.PositionClass = position;
    Snackbar.Add(message, type);
}

}

当我现在输入 URL 时,我被自动重定向到 。https://localhost:7076/Auth/respw2https://localhost:7076

如果我使用 导航到应用程序中的 URL,该页面将轻松运行。NavigationManager.NavigateTo

我真的不知道重定向发生在哪里以及为什么发生。

我希望有人有个主意......

PS:我忘了提:我已经用一个空白的Blazor WASM(托管)应用程序测试过了。在那里,我可以手动输入现有页面的 URL。所以这一定是我的应用程序有问题:-(

C# HTTP Blazor WebAssembly

评论

0赞 Sascha Heimann 8/14/2022
如果我使用 NavigationManager.Navigate(“/Auth/respw2”),它会转到 localhost:7076/Auth/respw2 当我在 localhost:7076/Index 并将 url localhost:7076/Auth/respw 粘贴到浏览器 url 字段中时,浏览器显示正在加载,然后重定向到 localhost:7076 /Index
0赞 Sascha Heimann 8/14/2022
对不起,被遗忘的 2 只是这里的一种类型:-(

答:

0赞 Sascha Heimann 8/18/2022 #1

所以,经过长时间的测试。我发现这个问题没有原因!

我通过执行以下操作解决了它:

  1. 创建一个空的 Blazor WASM(asp.net 核心托管)项目
  2. 删除所有组件、服务和控制器
  3. 从非工作项目中复制页面、组件、服务和控制器,并将它们粘贴到新的空白项目中。

路由通过手动输入 url 来工作。很奇怪...