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

Angular+.NET应用含/搜索值Azure部署404问题求助

解决方案

方案1:改用查询参数传递搜索词(推荐)

将搜索词从路由参数改为查询参数,彻底规避路径分隔符的解析冲突,这是跨环境最稳定的解决方案。

修改Angular服务代码:

search(word: string): Observable<ConsumerUnit[]> {
  const params = new HttpParams().set('query', word);
  return this.http.get<ConsumerUnit[]>(this.url + '/search', { headers: this.header(), params })
    .pipe(
      map((resp: any) => resp.data as ConsumerUnit[]),
      catchError(null)
    );
}

修改Controller代码:

[HttpGet]
[Route("search")]
[Authorize("ReadConsumerUnit")]
public async Task<IActionResult> GetSearch([FromQuery] string query)
{
    var result = await _consumerUnitAppService.SearchByNameOrDocumentAsync(query);
    return Response(true, result);
}

调用方法调整(可选):

查询参数的编码/解码会由框架自动处理,无需手动调用Uri.UnescapeDataString,可移除该行代码:

public async Task<List<ConsumerUnitDto>> SearchByNameOrDocumentAsync(string nameOrDocument)
{
    IQueryable<ConsumerUnit> query = Service.GetByExpression(x => x.Active);

    // 移除手动解码逻辑,框架已自动处理
    // nameOrDocument = Uri.UnescapeDataString(nameOrDocument); 
    
    if (!string.IsNullOrEmpty(nameOrDocument))
    {
        query = query.Where(x => x.Name.ToLower().Contains(nameOrDocument) || x.Document.Contains(nameOrDocument) || x.Number.Contains(nameOrDocument));
    }
    var list = await query.OrderBy(p => p.Name).ToListAsync();

    return Mapper.Map<List<ConsumerUnitDto>>(list);
}

方案2:配置Azure允许路径中的编码斜杠

若必须保留路由参数的方式,需调整ASP.NET Core配置和Azure的IIS设置:

1. 配置ASP.NET Core路由选项

在Program.cs中添加路由配置:

builder.Services.Configure<RouteOptions>(options =>
{
    options.AllowPathEncodedSlash = true; // 允许路径中存在编码后的斜杠
});

2. 修改Azure Web App应用设置

  • 登录Azure门户,进入目标Web App
  • 打开配置 > 应用程序设置
  • 添加新设置:WEBSITE_IIS_REQUEST_PATH_INVALID_CHARACTERS,值设为%3C,%3E,%2C,%20(移除默认包含的%2F)
  • 重启Web App使配置生效

3. 保留原有编码解码逻辑

完成上述配置后,原有的前端编码、后端解码代码可继续使用,确保encodeURIComponent将/编码为%2F,Uri.UnescapeDataString正常解码即可。

问题根源

本地开发使用的Kestrel服务器默认允许URL路径中包含编码后的%2F,不会将其解析为实际路径分隔符;而Azure部署后使用IIS,默认会把%2F解码为/,导致/search/10%2F2689123被解析成/search/10/2689123,无法匹配search/{encodedWord}的路由规则,因此返回404。

内容的提问来源于stack exchange,提问作者Bruno Ricardo Carmena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:38:12