Azurite容器上传下载地址异常:host.docker.internal与127.0.0.1功能互斥
Azurite容器上传下载地址冲突解决办法
我在Docker Desktop中运行了Azurite容器:
使用.NET实现的Blob上传代码如下:
public async Task<Uri> UploadAsync(IFormFile file, CancellationToken cancellationToken = default) { var fileName = $"{Guid.NewGuid()}{MimeTypeMap.GetExtension(file.ContentType)}"; var container = new BlobContainerClient(_configuration.ConnectionString, _configuration.ContainerName); var blobClient = container.GetBlobClient(fileName); await blobClient.UploadAsync(file.OpenReadStream(), cancellationToken); return blobClient.Uri; }
问题现象
- 用
http://host.docker.internal:10000/devstoreaccount1作为地址时,能正常上传Blob,生成的URL为:http://host.docker.internal:10000/devstoreaccount1/images/d2cb8b81-65d3-4b09-94b2-0907c01bf3ff.png - 用该URL(含访问令牌)下载图片时,出现
net::ERR_CONNECTION_TIMED_OUT错误 - 把地址替换为
127.0.0.1后可正常下载,但用127.0.0.1上传时,报错:Retry failed after 6 tries. Retry settings can be adjusted in ClientOptions.Retry. (Connection refused (127.0.0.1:10000))
原因分析
核心是容器内服务和本地客户端的网络视角不同:
- 容器内的.NET服务用
host.docker.internal能访问宿主机上的Azurite,所以上传成功;但本地浏览器无法正确解析或访问这个地址,导致下载超时。 - 本地用
127.0.0.1能直接访问宿主机的Azurite,但容器内的服务用127.0.0.1指向的是容器自身,不是宿主机,所以上传被拒绝。
解决方法
- 地址替换法(最简单)
修改上传代码,返回给客户端的下载地址自动替换成127.0.0.1:
public async Task<Uri> UploadAsync(IFormFile file, CancellationToken cancellationToken = default) { var fileName = $"{Guid.NewGuid()}{MimeTypeMap.GetExtension(file.ContentType)}"; var container = new BlobContainerClient(_configuration.ConnectionString, _configuration.ContainerName); var blobClient = container.GetBlobClient(fileName); await blobClient.UploadAsync(file.OpenReadStream(), cancellationToken); // 替换地址为本地可访问的127.0.0.1 var downloadUri = new Uri(blobClient.Uri.ToString().Replace("host.docker.internal", "127.0.0.1")); return downloadUri; }
- Hosts映射法
在本地hosts文件中添加一行:
127.0.0.1 host.docker.internal
这样本地浏览器也能解析host.docker.internal,直接用生成的URL就能下载。
- 区分配置地址
在.NET配置中分别设置服务端上传地址和客户端下载地址:
- 服务端连接字符串用
http://host.docker.internal:10000/devstoreaccount1(确保容器内服务能访问Azurite) - 下载地址模板用
http://127.0.0.1:10000/devstoreaccount1/{container}/{blob},上传后按模板拼接返回给客户端。
内容的提问来源于stack exchange,提问作者Mackovic
相关产品推荐
相关产品推荐

