如何通过需身份验证的URL获取CSV文件?C#代码异常求助
解决带认证的CSV文件下载问题
核心问题分析
你的代码使用async void作为方法返回值,在控制台应用中,主线程不会等待异步方法执行完成就会直接退出,这就是程序输出exited with code 0且catch块未触发的原因——异步请求还没执行完,程序就已经结束了。另外,原代码仅发送了HTTP请求,没有处理响应内容的本地保存逻辑。
修正后的完整代码
using System; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.IO; class Program { static async Task Main(string[] args) { await GetFile(); Console.ReadKey(); } internal static async Task GetFile() { try { // 配置认证处理器 var handler = new HttpClientHandler(); handler.Credentials = new NetworkCredential("User", "123456"); // 用using管理HttpClient,确保资源正确释放 using var client = new HttpClient(handler); var response = await client.GetAsync("http://192.168.1.2/Folder/File.csv"); // 主动校验HTTP响应状态,非2xx时抛出异常 response.EnsureSuccessStatusCode(); // 定义本地保存路径,这里默认存到程序运行目录 var localFilePath = Path.Combine(Environment.CurrentDirectory, "Downloaded_File.csv"); // 将响应内容写入本地文件 await using var fileStream = new FileStream(localFilePath, FileMode.Create, FileAccess.Write); await response.Content.CopyToAsync(fileStream); Console.WriteLine($"文件已成功保存至:{localFilePath}"); } catch (Exception ex) { Console.WriteLine($"下载失败:{ex.Message}"); // 输出内部异常,辅助排查深层问题 if (ex.InnerException != null) { Console.WriteLine($"内部异常详情:{ex.InnerException.Message}"); } } } }
关键修改说明
- 将
async void改为async Task,并在Main方法中用await等待异步操作完成(C# 7.1及以上版本支持异步Main方法) - 使用
using语句管理HttpClient和文件流,避免资源泄漏 - 新增
response.EnsureSuccessStatusCode()调用,主动捕获HTTP请求错误(如401未授权、404文件不存在等) - 添加本地文件保存逻辑,将响应流写入指定路径
- 扩展异常处理,输出内部异常信息,提升问题排查效率
额外注意事项
- 若项目使用低于C# 7.1的版本,可在Main方法中用
GetFile().GetAwaiter().GetResult()替代await(不推荐在复杂场景使用,可能引发死锁) - 确认服务器的认证类型为基本认证,若为NTLM或其他认证,需调整
HttpClientHandler的PreAuthenticate或UseDefaultCredentials属性 - 确保本地目标文件夹有写入权限,避免保存时触发权限异常
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

