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

