You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Blazor MAUI应用支付页面重定向:实例复用与页面跳转问题

Blazor MAUI 协议激活问题:复用实例+页面跳转

问题描述

Blazor MAUI应用调用API获取支付重定向URL,支付完成后会跳转到testapp://payment-success这类协议链接。当前存在两个问题:

  • 激活协议链接时会创建应用新实例,无法复用原有实例
  • 虽能在OnLaunched中提取协议参数,但无法跳转到对应Razor页面

当前已做配置

1. Package.appxmanifest 协议配置

在Application节点内添加协议扩展:

<uap:Extension Category="windows.protocol">
  <uap:Protocol Name="testapp" />
</uap:Extension>

2. App.xaml.cs 中的OnLaunched重写

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    var eventargs = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();
    if (eventargs.Kind is ExtendedActivationKind.Protocol && eventargs.Data is Windows.ApplicationModel.Activation.ProtocolActivatedEventArgs activationArgs)
    {
        var uri = activationArgs.Uri;
        var authority = uri.Authority;
        var localPath= uri.LocalPath;
    }
    base.OnLaunched(args);
}

解决方案

1. 实现应用实例复用

通过AppInstance的实例管理能力,避免创建新实例,将激活请求重定向到已有实例:

protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
    var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
    if (activationArgs.Kind == ExtendedActivationKind.Protocol)
    {
        // 注册唯一实例标识
        var instance = AppInstance.FindOrRegisterForKey("testapp-protocol");
        if (!instance.IsCurrent)
        {
            // 重定向激活请求到已有实例
            await instance.RedirectActivationToAsync(activationArgs);
            // 关闭当前新实例
            Application.Current.Exit();
            return;
        }
    }

    base.OnLaunched(args);
}

在App构造函数中订阅激活事件,处理已有实例的激活请求:

public App()
{
    InitializeComponent();
    AppInstance.GetCurrent().Activated += OnAppInstanceActivated;
}

private void OnAppInstanceActivated(object sender, AppActivationArguments args)
{
    if (args.Kind == ExtendedActivationKind.Protocol && args.Data is ProtocolActivatedEventArgs protocolArgs)
    {
        HandleProtocolNavigation(protocolArgs.Uri);
    }
}

2. 实现Razor页面跳转

步骤1:全局保存NavigationManager引用

在MainLayout.razor中注入并保存NavigationManager:

@inject NavigationManager NavManager
@code {
    protected override void OnInitialized()
    {
        App.NavigationManager = NavManager;
        base.OnInitialized();
    }
}

在App.xaml.cs中添加静态属性:

public static NavigationManager NavigationManager { get; set; }

步骤2:处理协议路由跳转

实现HandleProtocolNavigation方法,根据协议URI跳转对应页面:

private void HandleProtocolNavigation(Uri uri)
{
    // 确保在UI线程执行跳转
    Dispatcher.Dispatch(() =>
    {
        switch (uri.LocalPath)
        {
            case "/payment-success":
                NavigationManager?.NavigateTo("/payment-success-page");
                break;
            case "/payment-fail":
                NavigationManager?.NavigateTo("/payment-fail-page");
                break;
        }
    });
}

3. 注意事项

  • 确保目标Razor页面已配置正确路由,例如@page "/payment-success-page"
  • 如果应用处于后台,Dispatcher调度可保证UI操作正常执行

内容的提问来源于stack exchange,提问作者03v

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:57:33