.NET WinForms项目调用同解决方案API获取PDF的实现问题
解决方案
方案1:直接调用默认浏览器打开API地址(最简便)
你的PDF接口为公开GET请求、无额外鉴权的前提下,无需自行编写HTTP请求逻辑,直接启动系统默认浏览器访问接口地址即可,浏览器会自动处理PDF的加载展示:
using System.Diagnostics; // 直接调用即可实现需求 Process.Start(new ProcessStartInfo("http://localhost:44344/api/pdfcreator") { UseShellExecute = true });
注意:.NET Core 3.0+以上版本需要显式设置
UseShellExecute = true,否则可能无法正常启动浏览器。
方案2:先下载PDF到本地再打开
如果你需要先将PDF文件保存到本地再做后续处理,可以按以下说明修改代码:
核心错误说明
原有代码使用StreamReader读取响应是错误的,StreamReader是用来读取文本内容的工具类,PDF为二进制格式文件,按文本编码转换会直接破坏文件结构,导致文件无法正常打开。
修正后的代码示例
using System.Diagnostics; using System.IO; using System.Net; public void DownloadAndOpenPdf(string apiUrl) { // 生成临时PDF文件存储路径 string tempPdfPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.pdf"); var request = (HttpWebRequest)WebRequest.Create(apiUrl); request.Method = "GET"; using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var fileStream = new FileStream(tempPdfPath, FileMode.Create, FileAccess.Write)) { // 直接将二进制响应流写入本地文件,不做文本转换 responseStream.CopyTo(fileStream); } // 调用系统默认PDF阅读器打开本地文件 Process.Start(new ProcessStartInfo(tempPdfPath) { UseShellExecute = true }); } // 调用方式 DownloadAndOpenPdf("http://localhost:44344/api/pdfcreator");
可选优化:使用HttpClient(推荐)
如果是.NET Framework 4.5+或者.NET Core/.NET 5+项目,更推荐使用官方推荐的HttpClient替代已过时的HttpWebRequest:
// 建议将HttpClient声明为静态单例,不要每次请求都新建实例 private static readonly HttpClient _httpClient = new HttpClient(); public async Task DownloadAndOpenPdfAsync(string apiUrl) { string tempPdfPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.pdf"); // 异步获取二进制响应 byte[] pdfBytes = await _httpClient.GetByteArrayAsync(apiUrl); await File.WriteAllBytesAsync(tempPdfPath, pdfBytes); Process.Start(new ProcessStartInfo(tempPdfPath) { UseShellExecute = true }); }
内容的提问来源于stack exchange,提问作者user3408531
相关产品推荐
相关产品推荐

