REST POST请求接收PDF文件不完整及代码警告问题求助
解决方案
针对你遇到的两个问题,以下是修改后的代码及详细说明:
修改后的完整代码
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim a As New AppBehaviour With { .DEALER_ALWAYS_SAVE_DHP_XML_PDF_EXPORT_BIT = 4, .XML_EXPORT_XML_FORMAT = "UTF8", .DONOT_CREATE_NEW_CLOUDID = 1, .XML_EXPORT_INCLUDING_MANU_CUSTNR = 1 } Dim c As New Root With { .customerNo = "12345", .pass = "67890", .cloudId = "abcdef", .returnAsFile = True, .wawiManufacturer = "", .appBehaviour = a } Dim restUrl As String = "https://adresse.net" ' 若按钮频繁点击,建议将HttpClient声明为类级静态变量,避免重复创建连接 Using client As New Net.Http.HttpClient() Dim jsonData As String = JsonConvert.SerializeObject(c) Dim content As New StringContent(jsonData, System.Text.Encoding.UTF8, "application/json") Try Dim response As Net.Http.HttpResponseMessage = Await client.PostAsync(restUrl, content) ' 强制检查请求是否成功,失败时抛出明确异常 response.EnsureSuccessStatusCode() ' 异步读取完整响应流并写入文件 Using outputStream As Stream = File.Create("D:\test.pdf") Await response.Content.CopyToAsync(outputStream) End Using MessageBox.Show("文件已成功接收") Catch ex As Net.Http.HttpRequestException MessageBox.Show("请求错误: " & ex.Message) Catch ex As IOException MessageBox.Show("文件写入错误: " & ex.Message) Catch ex As Exception MessageBox.Show("未知错误: " & ex.Message) End Try End Using End Sub
问题修复说明
1. 消除代码警告
- 替换WebRequest为HttpClient:原代码创建了HttpClient却未使用,改用
HttpClient.PostAsync实现符合.NET推荐标准的异步HTTP请求,解决"建议使用HttpClient替代WebRequest"的警告。 - 添加Await关键字:对所有异步方法(
PostAsync、CopyToAsync)添加Await,确保异步操作正确执行,消除"缺失Await关键字"的警告。 - 优化HttpClient生命周期:用
Using语句管理HttpClient实例(若按钮频繁触发,建议将HttpClient声明为类级静态变量,避免重复创建连接导致的Socket资源耗尽)。
2. 修复PDF文件不完整问题
- 使用异步流拷贝:原代码的
input.CopyTo(output)是同步读取流,可能因网络波动或流读取不完整导致文件缺失;改用Await response.Content.CopyToAsync(outputStream),异步且可靠地读取全部响应内容。 - 改用File.Create创建文件:
File.Create会确保文件从起始位置写入(覆盖现有文件或创建新文件),避免因文件已有内容导致的写入偏移问题。 - 添加响应状态校验:通过
response.EnsureSuccessStatusCode()在请求返回4xx/5xx状态码时抛出明确异常,便于排查服务器端错误导致的文件异常。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

