异步从Dropbox下载文件遇空引用错误,寻求排查方案
错误排查与解决办法
空引用错误的核心原因
- 变量未初始化:
_token或_path_file为Nothing,拼接字符串时触发空引用异常。 - Dropbox-API-Arg格式错误:该请求头需要传递JSON格式的路径参数,而非直接传入文件路径字符串,若
_path_file未正确赋值或格式错误,也会引发后续异常。 - HttpClient滥用:每次创建新
HttpClient实例会耗尽连接资源,虽不是空引用直接原因,但会导致请求不稳定(比如你之前遇到的执行到SendAsync就退出的问题)。
修正后的代码
Async Function Download_Async(ByVal _file As String) As Task(Of Byte()) ' 复用HttpClient实例(建议全局单例) Static client As New HttpClient() ' 确保_token和_file不为空 If String.IsNullOrEmpty(_token) OrElse String.IsNullOrEmpty(_file) Then Throw New ArgumentNullException("Token或文件路径不能为空") End If Dim _Request As New HttpRequestMessage(HttpMethod.Post, "https://content.dropboxapi.com/2/files/download") ' 添加Authorization头 _Request.Headers.Add("Authorization", $"Bearer {_token}") ' 正确构造Dropbox-API-Arg的JSON格式 Dim dropboxArg = $"{{""path"": ""{_file}""}}" _Request.Headers.Add("Dropbox-API-Arg", dropboxArg) ' 发送请求并确保响应成功 Dim _message = Await client.SendAsync(_Request) _message.EnsureSuccessStatusCode() ' 抛出HTTP错误状态码异常 ' 下载二进制内容(适配视频、图片、文本等所有文件类型) Return Await _message.Content.ReadAsByteArrayAsync() End Function
关键修正点说明
- 变量校验:新增
_token和_file的非空判断,从源头避免空引用。 - Dropbox参数格式:将
Dropbox-API-Arg改为JSON格式的路径字符串,符合Dropbox API要求。 - HttpClient复用:用
Static关键字创建单例HttpClient,避免连接池耗尽问题,解决之前请求提前退出的异常。 - 响应处理优化:用
ReadAsByteArrayAsync()替代ReadAsStringAsync(),支持所有文件类型的二进制下载;添加EnsureSuccessStatusCode()捕获HTTP错误。 - 返回值调整:将返回类型改为
Task(Of Byte()),方便调用方处理下载后的文件内容(比如写入本地文件)。
调用示例
' 调用时必须使用Await Dim fileBytes = Await Download_Async("/test/video.mp4") ' 将字节数组写入本地文件 File.WriteAllBytes("C:\local\video.mp4", fileBytes)
内容的提问来源于stack exchange,提问作者Luca Geremei
相关产品推荐
相关产品推荐

