VB.Net获取BearerToken代码报错求助:Dynamic类型行出错
问题分析与解决方案
你的代码存在多处问题导致JObject.Parse语句报错,以下是具体问题和修复方案:
核心问题
- 重复定义函数:代码里写了两个完全一致的
GetBearerToken函数,这会直接触发编译错误,必须删除其中一个。 - 未处理响应失败场景:当请求返回非2xx状态码时,
response.Content可能是错误页面、纯文本等非JSON内容,此时执行JObject.Parse会抛出解析异常。 - Dynamic类型使用限制:VB.Net中使用
Dynamic需要将项目的Option Strict设置为Off,否则会编译报错;且Dynamic类型的可靠性远不如强类型访问。 - 可能缺少依赖与命名空间:若未通过NuGet安装
Newtonsoft.Json包,或未引入Newtonsoft.Json.Linq命名空间,JObject会无法被识别。
修复后的代码
以下是修正后的代码,采用强类型访问方式,同时增加响应有效性校验:
Imports Newtonsoft.Json.Linq ' 需先通过NuGet安装Newtonsoft.Json包,再引入此命名空间 Imports RestSharp ' 确保引入RestSharp命名空间,需先安装RestSharp NuGet包 Private Function GetBearerToken() As String Try Dim client = New RestClient(Config_class.tokenurl) Dim request = New RestRequest(Method.POST) request.AddHeader("cache-control", "no-cache") request.AddHeader("content-type", "application/x-www-form-urlencoded") ' 用字符串插值拼接参数,避免符号混用导致的问题 Dim paramContent = $"grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}" request.AddParameter("application/x-www-form-urlencoded", paramContent, ParameterType.RequestBody) Dim response As IRestResponse = client.Execute(request) ' 先校验请求是否成功 If Not response.IsSuccessful Then ' 可在此处记录错误信息,比如response.StatusCode、response.ErrorMessage Return "" End If ' 用JObject强类型索引访问替代Dynamic Dim resp As JObject = JObject.Parse(response.Content) ' 检查响应中是否包含access_token字段 If resp.ContainsKey("access_token") Then Return resp("access_token").ToString() Else Return "" End If Catch ex As Exception ' 建议添加日志记录异常详情,方便排查问题 ' 例如:Log.Error("获取BearerToken失败", ex) Return "" End Try End Function
额外建议
- 确保已通过NuGet安装
RestSharp和Newtonsoft.Json两个依赖包。 - 捕获异常时记录
ex.Message和response.Content,便于定位是请求失败还是JSON格式异常。 - 优先使用强类型访问(如JObject索引或自定义响应类反序列化),避免Dynamic类型带来的潜在问题。
内容的提问来源于stack exchange,提问作者hazem
相关产品推荐
相关产品推荐

