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

Blazor使用NavigateTo传多参数调用WebAPI下载文件的正确配置

问题根因

触发“抱歉,此地址不存在”错误是3处配置不匹配导致的:

  • 请求方法不匹配:NavigationManager.NavigateTo 传入第二个参数true时,会触发浏览器全页跳转,本质发送的是HTTP GET请求,但你的Download接口标记了[HttpPost],ASP.NET Core路由机制不会将GET请求匹配到仅支持POST的接口上,直接返回404
  • 路由层级缺失:常规Web API控制器会在类顶部标记[Route("api/[controller]")]特性,如果你的控制器类名是DownloadController,那接口的实际完整路径是/api/Download/Download/{fileId}/{fileName},你当前写的跳转路径少了Action对应的路由段
  • 参数未做编码:如果fileId或者文件名包含空格、.、/这类特殊字符,路由会将其识别为路径分隔符或静态文件后缀,导致路由匹配断裂
修正步骤

1. 调整接口请求方法

文件下载场景天然适配GET请求,不需要用POST,直接修改控制器特性即可,同时补充文件存在校验避免服务器报错:

[ApiController]
[Route("api/[controller]")]
public class DownloadController : ControllerBase
{
    // 将HttpPost改为HttpGet
    [HttpGet("{fileId}/{fileName}")]
    public async Task<IActionResult> Download(string fileId, string fileName)
    {
        var fullPath = Path.Combine(DownloadPath, fileId);
        if (!System.IO.File.Exists(fullPath))
            return NotFound();
        
        using (var ms = new MemoryStream())
        {
            await using (var stream = new FileStream(fullPath, FileMode.Open))
            {
                await stream.CopyToAsync(ms);
            }
            ms.Position = 0;
            return File(ms, "application/octet-stream", $"{fileName}.xlsx");
        }
    }
}

2. 修正Blazor端跳转代码

对参数做URL编码,避免特殊字符导致路由匹配失败,路径和控制器实际路由对齐:

public async Task SelectedDisplayDbItemChanged(DisplayDbItemsComboBoxItemDTO item)
{
    Data = null;
    Data = GetDataTable();
    var fileId = await utilities.ExportDataTableToFile((DataTable)Data).ConfigureAwait(false);
    // 对参数做URL编码,路径和控制器路由对齐
    navigationManager.NavigateTo(
        $"api/Download/{Uri.EscapeDataString(fileId)}/{Uri.EscapeDataString("myfile")}", 
        forceLoad: true);
}

3. 特殊场景兜底方案

如果你的文件名带扩展名、特殊符号,路径传参容易出现匹配问题,直接改用查询字符串传参,完全绕开路由段匹配的坑:

  • 控制器修改:
[HttpGet]
public async Task<IActionResult> Download([FromQuery] string fileId, [FromQuery] string fileName)
{
    // 内部业务逻辑和上面一致,不需要改动
}
  • 跳转代码修改:
navigationManager.NavigateTo(
    $"api/Download?fileId={Uri.EscapeDataString(fileId)}&fileName={Uri.EscapeDataString("myfile")}", 
    forceLoad: true);
验证方法

改完后先直接在浏览器地址栏拼接完整接口地址访问,能正常弹出下载框的话,再用Blazor代码跳转就不会出现地址不存在的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:33:19