.NET MAUI用Refit调用Web API抛出Connection failure异常求助
.NET MAUI + Refit + Firebase Auth 连接失败问题排查与解决
问题场景
在.NET MAUI项目中通过Refit包访问基于Firebase Auth做身份验证的ASP.NET Core Web API,Postman可正常请求接口,但MAUI端抛出System.Net.Http.HttpRequestException: 'Connection failure'异常。
可能的原因及解决方案
1. 服务器地址不可达
- 检查
serverBaseURL配置:- 本地开发时,不能使用
localhost作为服务器地址,需替换为电脑的局域网IP(如192.168.1.100),模拟器/真机无法通过localhost访问电脑本地服务。 - 确认地址末尾是否包含斜杠,Refit会自动拼接路径,避免因格式错误导致请求地址无效。
- 本地开发时,不能使用
- 测试网络连通性:
- 在MAUI设备上ping服务器IP,确认网络可达;用telnet测试API端口是否开放(如
telnet 192.168.1.100 5000)。 - 检查服务器防火墙是否放行API端口,确保没有拦截MAUI设备的请求。
- 在MAUI设备上ping服务器IP,确认网络可达;用telnet测试API端口是否开放(如
2. Android网络权限与明文流量限制
- 添加网络权限:
在MAUI Android项目的AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 允许明文HTTP流量(非HTTPS场景):
Android 9及以上默认禁止明文HTTP请求,若API使用HTTP协议,需在AndroidManifest.xml的<application>标签中添加:
或通过网络安全配置文件精准允许特定域名的明文流量:android:usesCleartextTraffic="true"- 在
Resources/xml目录下创建network_security_config.xml:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">你的服务器IP或域名</domain> </domain-config> </network-security-config> - 在
AndroidManifest.xml的<application>标签引用该配置:android:networkSecurityConfig="@xml/network_security_config"
- 在
3. Firebase Token获取异常
Postman手动携带有效Token可正常请求,但MAUI端可能因Token获取失败间接引发连接异常:
- 排查Token获取逻辑:
在FirebaseAuthHttpMessageHandler中添加日志,确认Token是否正常获取:protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { try { string? firebaseToken = await _googleAuthenticationService.GetFreshToken(); System.Diagnostics.Debug.WriteLine($"Firebase Token: {firebaseToken ?? "空值"}"); if (firebaseToken != null) request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", firebaseToken); return await base.SendAsync(request, cancellationToken); } catch(Exception ex) { System.Diagnostics.Debug.WriteLine($"Token获取异常: {ex.Message}"); throw; } } - 验证Token有效性:
将MAUI获取到的Token复制到Postman中测试,确认Token未过期、格式正确。
4. Refit与HttpMessageHandler配置问题
- 排除Handler干扰:
临时绕过Refit和自定义Handler,直接用HttpClient发起请求测试:
如果该测试成功,说明是Refit或自定义Handler的配置问题,可重新检查依赖注入顺序:public async Task<SummaryRequest> GetSummaryAsync(string content) { var requestData = new SummaryRequest { Content = content }; var token = await _googleAuthenticationService.GetFreshToken(); using var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(serverBaseURL); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var response = await httpClient.PostAsJsonAsync("/api/openai/summary", requestData); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadFromJsonAsync<SummaryRequest>(); if (!string.IsNullOrWhiteSpace(result?.Error)) throw new Exception(result.Error); return result; }// 确保配置顺序正确 builder.Services.AddTransient<FirebaseAuthHttpMessageHandler>(); builder.Services.AddRefitClient<IGetSummaryFromChatGPTQuery>() .ConfigureHttpClient(c => c.BaseAddress = new Uri(serverBaseURL)) .AddHttpMessageHandler<FirebaseAuthHttpMessageHandler>();
5. HTTPS证书信任问题(HTTPS场景)
若API使用自签名HTTPS证书,MAUI Android会默认拒绝信任:
- 添加证书到项目:
将自签名证书文件(如cert.pem)放到Android项目的Resources/raw目录(无则创建)。 - 配置证书信任:
修改network_security_config.xml:
并在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="@raw/cert" /> <!-- 证书文件名,不含后缀 --> </trust-anchors> </base-config> </network-security-config>AndroidManifest.xml的<application>标签引用该配置。
内容的提问来源于stack exchange,提问作者Адміністратор Денис
相关产品推荐
相关产品推荐

