You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过需身份验证的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:35:16