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

Plaid API回调中带JSInvokable标记的Blazor方法无法调用

问题解决方案

针对你在Plaid API的onSuccess回调中无法调用Blazor方法的问题,核心原因是DotNetObjectReference的生命周期管理不当,加上回调上下文的异步处理问题,以下是具体修复方案:

1. 修正Blazor代码:保留DotNetObjectReference引用

将DotNetObjectReference从局部变量改为组件字段,避免被GC提前回收,同时实现IDisposable释放引用防止内存泄漏:

using Microsoft.JSInterop;
using System;

public partial class YourComponent : IDisposable
{
    private string LinkToken { get; set; } = string.Empty;
    private string PublicToken { get; set; } = string.Empty;
    private DotNetObjectReference<YourComponent>? _dotNetRef; // 改为组件字段

    private async Task InitializePlaid()
    {
        this.LinkToken = await this.apiService.GetPlaidLinkToken();
        this._dotNetRef = DotNetObjectReference.Create(this); // 保存引用

        await this.jsRuntime.InvokeVoidAsync
        (
            "InitializePlaidLink",
            this._dotNetRef,
            this.LinkToken
        );
    }

    [JSInvokable]
    public void OnPlaidLinkSuccess(string publicToken)
    {
        this.PublicToken = publicToken;
        // 若需更新UI,可添加StateHasChanged()
        // StateHasChanged();
    }

    // 实现IDisposable释放引用
    public void Dispose()
    {
        _dotNetRef?.Dispose();
    }
}

2. 修正JavaScript代码:异步处理invoke调用

将onSuccess回调改为异步函数,并await invokeMethodAsync,确保上下文正确传递:

async function InitializePlaidLink(objRef, linkToken) {
    const handler = Plaid.create({
        token: linkToken,
        onSuccess: async (public_token, metadata) => {
            // 等待Blazor方法执行完成
            await objRef.invokeMethodAsync('OnPlaidLinkSuccess', public_token);
            console.log("After Invoke Method Async");
        },
        onLoad: () => {},
        onExit: (err, metadata) => {},
        onEvent: (eventName, metadata) => {},
        //required for OAuth; if not using OAuth, set to null or omit:
        //receivedRedirectUri: window.location.href,
    });

    handler.open();
}

关键原因说明

  • DotNetObjectReference回收问题:原代码中dotNetReference是InitializePlaid方法的局部变量,方法执行完毕后可能被.NET垃圾回收器回收,当Plaid的onSuccess回调触发时,objRef已失效,导致调用失败。
  • 异步上下文问题:invokeMethodAsync返回Promise,在Plaid的回调中使用await可以确保异步调用在正确的上下文完成,避免因上下文切换导致的调用丢失。

额外检查点

  • 打开浏览器开发者工具的控制台,查看是否有objRef失效相关的错误信息。
  • 确保组件在Plaid回调触发时未被卸载(比如用户未导航到其他页面)。
  • 确认[JSInvokable]标记的方法名与JS中调用的名称完全一致(大小写敏感)。

内容的提问来源于stack exchange,提问作者Jake Oliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:40:31