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

Azure BLOB浏览器直连下载提示‘检查网络连接’问题求助

问题分析与解决方案

直接流式下载Azure Blob到浏览器失败,但先下载到本地再转发正常,主要有以下几个可能原因及对应修复方式:

1. 文件名未编码导致浏览器解析异常

Content-Disposition中的文件名如果包含中文、空格或特殊字符,浏览器无法正确解析,会触发网络错误提示。

修复:用HttpUtility.UrlEncode对文件名进行编码,确保浏览器能识别。

2. 响应缓冲未关闭,导致流传输不完整

ASP.NET默认会缓冲响应内容,如果没有关闭缓冲,可能导致部分流数据未及时发送到浏览器,引发连接异常。

修复:设置response.BufferOutput = false,让数据实时流式传输。

3. CompleteRequest调用时机过早

在流还未完全复制到响应输出流时就调用CompleteRequest,会提前终止响应处理,导致浏览器接收不完整数据。

修复:将CompleteRequest移到using块内部,确保流操作完成后再调用。

4. 同步流复制阻塞线程引发超时

同步的CopyTo操作在ASP.NET环境下可能阻塞请求线程,导致浏览器端超时,触发网络连接检查提示。

修复:改用异步的CopyToAsync方法,并将方法改为异步模式,避免线程阻塞。


修改后的完整代码

using System.Web;
using System.Threading.Tasks;

public async Task DownloadFromAzureBLOB(string containerName, string blobName, HttpContext context, Page page)
{
    var response = page.Response;
    BlobServiceClient blobServiceClient = new BlobServiceClient(Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING"));
    BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);
    BlobClient blobClient = blobContainerClient.GetBlobClient(blobName);

    try
    {
        await ServeBlobToClientAsync(blobClient, blobName, response);
    }
    catch (Exception ex)
    {
        response.Clear();
        response.ContentType = "text/plain";
        response.Write($"An error occurred: {ex.Message}");
        response.End();
    }
}

private async Task ServeBlobToClientAsync(BlobClient blobClient, string downloadFileName, HttpResponse response)
{
    BlobProperties properties = (await blobClient.GetPropertiesAsync()).Value;

    response.Clear();
    response.ClearHeaders();
    response.ClearContent();
    // 关闭响应缓冲,实时流式传输
    response.BufferOutput = false;
    // 编码文件名,处理特殊字符/中文
    string encodedFileName = HttpUtility.UrlEncode(downloadFileName);
    response.AddHeader("Content-Disposition", $"attachment; filename=\"{encodedFileName}\"; filename*=UTF-8''{encodedFileName}");
    response.AddHeader("Content-Length", properties.ContentLength.ToString());
    response.ContentType = properties.ContentType ?? "application/octet-stream";

    using (var blobStream = await blobClient.OpenReadAsync())
    {
        // 异步复制流,避免线程阻塞
        await blobStream.CopyToAsync(response.OutputStream);
        response.Flush();
        // 确保流传输完成后再终止请求处理
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
}

额外注意事项

  • 确保Azure Blob的访问权限正确,blobClient能正常读取Blob内容(可通过日志验证blobStream是否能正常打开)。
  • 检查服务器端是否有防火墙或代理限制大文件的流式传输,导致连接中断。
  • 可以在浏览器开发者工具的网络标签页查看响应状态码和头信息,确认是否有4xx/5xx错误或头信息异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:45:04