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
相关产品推荐
相关产品推荐

