使用C#代码下载Azure Data Lake Gen2中CSV文件时遇访问异常
报错信息
下载CSV文件时触发的异常链:
---> Microsoft.WindowsAzure.Storage.StorageException: The requested name is valid, but no data of the requested type was found.
---> System.Net.Http.HttpRequestException: The requested name is valid, but no data of the requested type was found.
---> System.Net.Sockets.SocketException (11004): The requested name is valid, but no data of the requested type was found.
问题本质
这个11004错误核心是DNS解析失败,无法定位存储账户的服务端点;再加上你使用的是已被弃用的Microsoft.WindowsAzure.Storage SDK,该库对ADLS Gen2的分层命名空间支持不完善,双重因素导致连接失败。
解决方案
1. 切换到官方推荐的Azure.Storage.Blobs SDK
弃用旧的WindowsAzure.Storage库,改用专门适配Blob存储和ADLS Gen2的Azure.Storage.Blobs包:
- 在NuGet包管理器中安装
Azure.Storage.Blobs,或执行命令:Install-Package Azure.Storage.Blobs
2. 修正连接字符串与端点配置
ADLS Gen2默认使用DFS端点(dfs.core.windows.net),需在连接字符串中明确指定,确保DNS解析正确:
string connectionString = $"DefaultEndpointsProtocol=https;AccountName={blobAccountName};AccountKey={blobAccountKey};BlobEndpoint=https://{blobAccountName}.dfs.core.windows.net/;";
3. 重构代码(异步适配+新SDK)
避免使用.Result阻塞异步调用(易引发死锁),同时适配新SDK的API:
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Specialized; using System.IO; using System.Threading.Tasks; public static async Task<string[]> DownloadContentsFromAdlsAsync(string blobAccountName, string blobAccountKey, string containerName, string blobFileName, string blobStoragePath) { Console.WriteLine("Inside download contents from ADLS()"); // 构建ADLS Gen2适配的连接字符串 string connectionString = $"DefaultEndpointsProtocol=https;AccountName={blobAccountName};AccountKey={blobAccountKey};BlobEndpoint=https://{blobAccountName}.dfs.core.windows.net/;"; // 初始化Blob服务客户端 BlobServiceClient serviceClient = new BlobServiceClient(connectionString); // 获取容器引用 BlobContainerClient containerClient = serviceClient.GetBlobContainerClient(containerName); // 拼接完整的分层文件路径(ADLS Gen2支持目录结构) string fullBlobPath = Path.Combine(blobStoragePath, blobFileName).Replace("\\", "/"); // 获取Blob客户端 BlockBlobClient blobClient = containerClient.GetBlockBlobClient(fullBlobPath); // 异步下载文本内容 var downloadResult = await blobClient.DownloadContentAsync().ConfigureAwait(false); string contentText = downloadResult.Value.Content.ToString(); Console.WriteLine("Contents from ADLS has been Downloaded!"); return ConvertStringToStringArray(contentText); }
4. 额外检查项
- 确认存储账户已启用分层命名空间(ADLS Gen2必备特性)
- 检查网络防火墙设置:确保运行代码的环境允许出站访问
*.core.windows.net和*.dfs.core.windows.net - 验证存储账户密钥、容器名称、文件路径的正确性(Azure存储资源名称大小写敏感)
内容的提问来源于stack exchange,提问作者Ganeshan

