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

Azurite容器上传下载地址异常:host.docker.internal与127.0.0.1功能互斥

Azurite容器上传下载地址冲突解决办法

我在Docker Desktop中运行了Azurite容器:
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指向的是容器自身,不是宿主机,所以上传被拒绝。

解决方法

  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;
}
  1. Hosts映射法
    在本地hosts文件中添加一行:
127.0.0.1   host.docker.internal

这样本地浏览器也能解析host.docker.internal,直接用生成的URL就能下载。

  1. 区分配置地址
    在.NET配置中分别设置服务端上传地址和客户端下载地址:
  • 服务端连接字符串用http://host.docker.internal:10000/devstoreaccount1(确保容器内服务能访问Azurite)
  • 下载地址模板用http://127.0.0.1:10000/devstoreaccount1/{container}/{blob},上传后按模板拼接返回给客户端。

内容的提问来源于stack exchange,提问作者Mackovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:07:17