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

无法从QuickBooks QBOConceptsTutorial-DotNet示例应用获取Token

QuickBooks API TokenClient实例化失败问题解决

我正在学习使用QuickBooks API,将自有应用与平台后端集成,实现发票和客户记录的请求功能。从QuickBooks开发者网站的Git仓库下载了QBOConceptsTutorial-DotNet示例应用,但该应用无法启动,HTTPS调用失败。于是我在Visual Studio 2022社区版中创建了一个类似的新应用,复制了所有必要代码,新应用可以正常启动,也能通过Sandbox账号和密钥凭证连接到QuickBooks Sandbox公司。

回调返回的变量没有错误,但点击“Get Token”模块时,执行以下代码时出现失败:

var tokenClient = new TokenClient(AppController.tokenEndpoint, AppController.clientid, AppController.clientsecret);

错误信息及堆栈跟踪如下:

Line 68:{
Line 69:             //Request Oauth2 tokens
Line 70:             var tokenClient = new TokenClient(AppController.tokenEndpoint, AppController.clientid, AppController.clientsecret);
Line 71: 
Line 72: 

Source File: D:\Source\Repos\QBOAPI\QBOAPI\Controllers\CallbackController.cs    Line: 70

Stack Trace:


[MissingMethodException: Method not found: 'Serilog.LoggerConfiguration Serilog.FileLoggerConfigurationExtensions.File(Serilog.Configuration.LoggerSinkConfiguration, System.String, Serilog.Events.LogEventLevel, System.String, System.IFormatProvider, System.Nullable`1<Int64>, Serilog.Core.LoggingLevelSwitch, Boolean, Boolean, System.Nullable`1<System.TimeSpan>, Serilog.RollingInterval, Boolean, System.Nullable`1<Int32>, System.Text.Encoding, Serilog.Sinks.File.FileLifecycleHooks)'.]
   Intuit.Ipp.OAuth2PlatformClient.Diagnostics.OAuthAdvancedLogging..ctor(Boolean enableSerilogRequestResponseLoggingForDebug, Boolean enableSerilogRequestResponseLoggingForTrace, Boolean enableSerilogRequestResponseLoggingForConsole, Boolean enableSerilogRequestResponseLoggingForFile, String serviceRequestLoggingLocationForFile) in C:\Users\nshrivastava\Documents\GitHub\QuickBooks-V3-DotNET-SDK\IPPDotNetDevKitCSV3\Code\Intuit.Ipp.OAuth2PlatformClient.Diagnostics\OAuthAdvancedLogging.cs:238
   Intuit.Ipp.OAuth2PlatformClient.TokenClient..ctor(String endpoint, HttpMessageHandler innerHttpMessageHandler) in C:\Users\nshrivastava\Documents\GitHub\QuickBooks-V3-DotNET-SDK\IPPDotNetDevKitCSV3\Code\Intuit.Ipp.OAuth2PlatformClient\Client\TokenClient.cs:52
   Intuit.Ipp.OAuth2PlatformClient.TokenClient..ctor(String endpoint, String clientId, String clientSecret, HttpMessageHandler innerHttpMessageHandler, AuthenticationStyle style) in C:\Users\nshrivastava\Documents\GitHub\QuickBooks-V3-DotNET-SDK\IPPDotNetDevKitCSV3\Code\Intuit.Ipp.OAuth2PlatformClient\Client\TokenClient.cs:90
   Intuit.Ipp.OAuth2PlatformClient.TokenClient..ctor(String endpoint, String clientId, String clientSecret, AuthenticationStyle style) in C:\Users\nshrivastava\Documents\GitHub\QuickBooks-V3-DotNET-SDK\IPPDotNetDevKitCSV3\Code\Intuit.Ipp.OAuth2PlatformClient\Client\TokenClient.cs:77
   QBOAPI.Controllers.<Token>d__17.MoveNext() in D:\Source\Repos\QBOAPI\QBOAPI\Controllers\CallbackController.cs:70
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +32
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
   System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +92
   System.Web.Mvc.Async.<>c__DisplayClass8_0.<BeginInvokeAsynchronousActionMethod>b__1(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass11_0.<InvokeActionMethodFilterAsynchronouslyRecursive>b__0() +80
   System.Web.Mvc.Async.<>c__DisplayClass11_2.<InvokeActionMethodFilterAsynchronouslyRecursive>b__2() +396
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass3_6.<BeginInvokeAction>b__4() +50
   System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult) +188
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +38
   System.Web.Mvc.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +73
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +52
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +38
   System.Web.Mvc.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) +43
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +73
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +646
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +182
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +134

问题原因

这个MissingMethodException是Serilog版本不兼容导致的:QuickBooks的OAuth2 SDK依赖特定版本的Serilog(尤其是Serilog.Sinks.File包),而你项目中引用的Serilog版本没有SDK调用的那个File方法重载,所以实例化TokenClient时触发了错误。

解决步骤

  • 检查并对齐Serilog版本
    打开项目的NuGet包管理器,查看当前安装的Serilog和Serilog.Sinks.File版本;查看Intuit.Ipp.OAuth2PlatformClient包的依赖项,找到它要求的Serilog版本;卸载当前的Serilog相关包,安装与SDK兼容的版本。
  • 清理并重新生成项目
    删除项目的bin和obj文件夹;在Visual Studio中执行清理解决方案,再执行生成解决方案。
  • 禁用SDK的Serilog日志(可选)
    如果不想调整包版本,可以在实例化TokenClient前关闭SDK的高级日志功能,示例代码:
    // 关闭文件日志等高级日志配置
    Intuit.Ipp.OAuth2PlatformClient.Diagnostics.OAuthAdvancedLogging.DisableLogging();
    var tokenClient = new TokenClient(AppController.tokenEndpoint, AppController.clientid, AppController.clientsecret);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:55:19