Java代码配置Azure Storage代理上传文件报连接超时问题
Java 为Azure File Storage客户端配置正向代理的正确方式
配置失效原因
此前往Configuration中写入https.proxyHost、java.net.useSystemProxies参数的方式不生效,核心原因是:
- Azure Storage Java SDK v12+版本默认使用Netty异步HTTP客户端发送请求,不会主动读取存入
com.azure.core.util.Configuration的JVM系统代理属性 java.net.useSystemProxies配置仅对JDK原生HttpURLConnection生效,对Netty客户端无作用
可直接运行的实现代码
默认引入azure-storage-file-share依赖时会传递依赖Netty HTTP客户端包,无需额外引入(手动排除过该依赖的场景看后面的适配说明),配置代码如下:
import com.azure.core.http.HttpClient; import com.azure.core.http.ProxyOptions; import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; import com.azure.storage.file.share.ShareDirectoryClient; import com.azure.storage.file.share.ShareFileClientBuilder; import java.net.InetSocketAddress; public class AzureStorageUploadService { public void uploadFileToShare() { // 1. 构造代理参数 ProxyOptions proxyOptions = new ProxyOptions( ProxyOptions.Type.HTTP, new InetSocketAddress("替换为代理主机IP/域名", 替换为实际代理端口) ); // 代理开启身份认证时放开下面这行,无认证可直接跳过 // proxyOptions.setCredentials("代理账号", "代理密码"); // 2. 注入代理构造HTTP客户端实例 HttpClient proxyHttpClient = new NettyAsyncHttpClientBuilder() .proxy(proxyOptions) .build(); // 3. 构造存储目录客户端 String connectStr = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey + ";EndpointSuffix=" + endpoint; ShareDirectoryClient dirClient = new ShareFileClientBuilder() .connectionString(connectStr) .shareName(shareName) .resourcePath(directoryName) .httpClient(proxyHttpClient) .buildDirectoryClient(); // 原有文件上传逻辑保持不变 dirClient.createFile(fileName, body.length()); } }
特殊场景适配
- 如果手动排除了Netty依赖,改用JDK原生HTTP客户端作为SDK的HTTP实现,只需要把
NettyAsyncHttpClientBuilder替换为com.azure.core.http.jdk.httpclient.JdkHttpClientBuilder即可,ProxyOptions的配置逻辑完全一致 - 如果使用SOCKS5类型代理,将
ProxyOptions.Type.HTTP替换为ProxyOptions.Type.SOCKS5即可 - 不要通过
ShareFileClientBuilder.configuration()方法传入代理相关配置,该方法仅用于加载SDK自身的配置项,不会把代理参数透传给底层HTTP客户端
内容的提问来源于stack exchange,提问作者Carlito
相关产品推荐
相关产品推荐

