使用Microsoft.WindowsAzure.Storage迁移至Azure TLS 1.2的方法
.NET Framework 4.5下Azure存储Blob下载适配TLS 1.2的解决方案
问题背景
基于.NET Framework 4.5的应用,使用Microsoft.WindowsAzure.Storage命名空间的API下载Azure Blob存储中的图片。当环境TLS协议升级至1.2后,该下载方法无法正常工作(推测因异常触发catch逻辑返回null),回退到TLS1.0后恢复正常。需明确是否需要更新组件引用或添加安全配置来适配TLS1.2。
核心解决方案
1. 升级Microsoft.WindowsAzure.Storage NuGet包
旧版本的Microsoft.WindowsAzure.Storage库对TLS1.2的支持不完善,需升级至8.7.0及以上版本(该版本开始全面支持TLS1.2)。通过NuGet包管理器搜索并更新至兼容.NET Framework 4.5的最高稳定版本(旧版库最终稳定版为9.3.3)。
2. 强制启用TLS 1.2协议
.NET Framework 4.5默认未将TLS1.2设为默认安全协议,需在代码中显式指定:
在创建CloudBlobClient之前添加以下代码(需引用System.Net命名空间):
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
3. 可选:通过配置文件全局启用TLS1.2
若不想修改代码,可在应用的app.config或web.config中添加以下配置,全局强制应用使用TLS1.2:
<configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false"/> </runtime> </configuration>
修改后的示例代码
using System.Net; using System.IO; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Blob; public static MemoryStream DownloadBlob_AsMemStreamTemp(string blobFilePath) { try { // 强制启用TLS 1.2 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; string blobStorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=MyAccount;AccountKey=[key];EndpointSuffix=core.windows.net"; CloudStorageAccount blobStorageAccount = CloudStorageAccount.Parse(blobStorageConnectionString); CloudBlobClient blobClient = blobStorageAccount.CreateCloudBlobClient(); CloudBlobContainer containerReference = blobClient.GetContainerReference("MyContainer"); containerReference.CreateIfNotExists(); CloudBlockBlob blob = containerReference.GetBlockBlobReference(blobFilePath); MemoryStream ms = new MemoryStream(); blob.DownloadToStream(ms); // 重置流指针到起始位置,避免调用方读取时无数据 ms.Position = 0; return ms; } catch (Exception ex) { // 建议添加日志记录,便于排查问题 // Logger.Error("下载Blob失败", ex); return null; } }
额外说明
- 升级NuGet包后需确认Azure存储账户已禁用TLS1.0/1.1(当前Azure存储已强制要求TLS1.2及以上)。
- 原代码中
CloudBlobContainer blobContainer = containerReference;为冗余代码,可直接使用containerReference调用后续方法。 - 下载完成后重置
MemoryStream的Position为0,避免调用方读取流时因指针在末尾导致无数据。
内容的提问来源于stack exchange,提问作者E. A. Bagby
相关产品推荐
相关产品推荐

