c#接口请求报错
目录
一、场景
Blazor Server 开发
二、解决办法
解法 A
解法 B
三、总结
一、场景
Blazor Server 开发
今天遇见使用HttpClient 进行本地json文件请求时候报错 System.Net.Http.HttpRequestException:“Response status code does not indicate success: 502 (Bad Gateway).”
502(Bad Gateway)多数不是 JSON 文件的问题,而是Blazor Server 里用 HttpClient 去“再走一遍网关/反向代理访问自己”出了岔子(端口/协议不一致、IIS Express/Kestrel 转发异常、开发证书/HTTP2 协议等都可能触发 502)。最稳的办法:别走 HTTP,再访问磁盘即可。
二、解决办法
解法 A
(推荐,Blazor Server):直接从 wwwroot 读文件,不走网络,自然不会 502
@using System.Text.Json
@using System.IO
@inject IWebHostEnvironment Env@code {private MenuDataItem[] _menuData = Array.Empty<MenuDataItem>();protected override async Task OnInitializedAsync(){var path = Path.Combine(Env.WebRootPath, "data", "menu.json"); // wwwroot/data/menu.jsonawait using var fs = File.OpenRead(path);_menuData = await JsonSerializer.DeserializeAsync<MenuDataItem[]>(fs, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? Array.Empty<MenuDataItem>();}
}
解法 B
把“自己调自己”的不确定性降到最低:
- Program.cs(Blazor Server)把
HttpClient的BaseAddress绑定到站点实际地址,并强制 HTTP/1.1(规避某些反代的 HTTP/2 502):
builder.Services.AddScoped(sp =>
{var nav = sp.GetRequiredService<NavigationManager>();var handler = new HttpClientHandler{// 开发环境可临时忽略证书(仅开发用!)ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator};return new HttpClient(handler){BaseAddress = new Uri(nav.BaseUri),DefaultRequestVersion = new Version(1, 1)};
});
- 组件里用绝对地址(由
NavigationManager拼出来,确保协议/端口一致)并加上异常日志:
@inject HttpClient Http
@inject NavigationManager Nav@code {private MenuDataItem[] _menuData = Array.Empty<MenuDataItem>();protected override async Task OnInitializedAsync(){try{var url = new Uri(new Uri(Nav.BaseUri), "data/menu.json");_menuData = await Http.GetFromJsonAsync<MenuDataItem[]>(url, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }) ?? Array.Empty<MenuDataItem>();}catch (Exception ex){Console.WriteLine($"加载菜单失败:{ex}");_menuData = Array.Empty<MenuDataItem>();}}
}
另外确认:app.UseStaticFiles(); 已在 Program.cs 的中间件管线里;浏览器能直接打开 http(s)://<你的端口>/data/menu.json 说明这步没问题。
三、总结
结论:在 Blazor Server 场景,优先用“解法 A 直接读文件”。如果必须用 HttpClient,就按“解法 B”把 BaseAddress 绑定到 Nav.BaseUri、强制 HTTP/1.1,并在开发环境放宽证书校验,基本就不会再见到 502 了。
