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
相关产品推荐
相关产品推荐

