解决Android应用调用ASP.Net Core Web API时出现的unexpected end of stream异常问题
你遇到的核心问题很明确:ASP.NET Core 5.0 API部署在企业IIS服务器上时,移动应用调用会抛出System.Exception: 'unexpected end of stream on com.android.okhttp.Address@xxxx'异常,但直接通过dotnet MyAPI.dll --urls "http://*:myportnumber"启动API时完全正常。结合你的描述和排查记录,这个问题大概率和IIS托管配置、反向代理(FortiWeb)设置,或者API的HTTPS处理逻辑有关。下面是针对性的解决方案:
1. 先确认IIS的ASP.NET Core基础配置
直接用dotnet命令启动正常,但IIS部署异常,首先要排查IIS的托管环境是否正确:
- 确保服务器已安装ASP.NET Core 5.0 Runtime Hosting Bundle:这是IIS托管ASP.NET Core应用的必要组件,缺失会导致IIS无法正确转发请求到API进程。
- 检查应用程序池设置:
- 将.NET CLR版本设置为无托管代码(ASP.NET Core是自托管模型,IIS仅作为反向代理,不需要托管代码)。
- 确认应用程序池的身份拥有API目录的读写权限,以及数据库访问的权限(避免因权限不足导致请求中途失败)。
- 核对站点绑定:
- 如果用HTTP,确保IIS站点绑定的端口和你在
UseUrls中配置的myportnumber一致;如果是HTTPS,要保证证书配置有效,且API能识别到HTTPS端口(解决你之前遇到的Failed to determine the https port for redirect警告)。
- 如果用HTTP,确保IIS站点绑定的端口和你在
2. 修复HTTPS重定向的配置问题
你之前忽略的HTTPS重定向警告,可能是IIS环境下请求中断的关键诱因。可以做以下调整:
- 在
Startup.cs的ConfigureServices中,明确指定HTTPS重定向端口(对应FortiWeb对外提供的HTTPS端口):
services.AddHttpsRedirection(options => { options.HttpsPort = 443; // 替换为FortiWeb实际使用的HTTPS端口 });
- 如果你的API暂时不需要HTTPS重定向,可以直接移除
app.UseHttpsRedirection();这一行(但如果移动应用是通过HTTPS访问API,这一步要谨慎,需确保API能正确处理HTTPS请求)。
3. 检查FortiWeb反向代理的配置
因为API是通过FortiWeb向公网开放,反向代理的设置可能导致请求/响应被提前截断:
- 调整FortiWeb的超时设置:将连接超时、请求超时设置为合理值(比如30秒以上),避免长请求被提前切断。
- 启用HTTP Keep-Alive:如果FortiWeb禁用了Keep-Alive,会导致客户端的连接被提前关闭,引发流结束异常。
- 配置转发头识别:ASP.NET Core需要FortiWeb传递的
X-Forwarded-For、X-Forwarded-Proto等头来正确识别原始请求信息,在Startup.cs中添加如下配置:
// 在ConfigureServices中添加 services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 添加FortiWeb服务器的IP到可信代理列表 options.KnownProxies.Add(IPAddress.Parse("你的FortiWeb服务器IP")); }); // 在Configure方法中,放在UseRouting之前执行 app.UseForwardedHeaders();
4. 修正Android端的网络安全配置
你之前的network_security_config.xml有个小错误:<domain>标签应该只填域名,不能包含完整URL路径。修正后的配置如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">ourenterpriseurl.com.br</domain> </domain-config> </network-security-config>
如果你的API是通过HTTP访问(不推荐生产环境使用),需要将cleartextTrafficPermitted改为true,或者确保移动应用访问的是HTTPS地址。
5. 开启API详细日志排查问题
为了精准定位请求中断的具体原因,建议开启API的Debug级日志:
- 在
appsettings.json中调整日志级别:
{ "Logging": { "LogLevel": { "Default": "Debug", "Microsoft": "Debug", "Microsoft.Hosting.Lifetime": "Information" } } }
- 部署到IIS后,查看Windows事件查看器的应用程序日志,或者API目录下生成的日志文件,寻找请求处理过程中的异常细节。
6. 检查IIS的请求限制设置
IIS默认的请求大小、超时限制可能导致大请求被截断:
- 打开IIS管理器,进入你的站点,点击请求筛选,检查请求限制中的最大允许内容长度(默认30MB),如果API处理大文件或大请求,需要调大这个值。
- 检查连接超时设置,确保它足够长,避免请求未处理完成就被IIS断开。
优先从IIS托管配置和FortiWeb反向代理入手排查,这两个环节是自托管和IIS托管的核心差异点,也是最可能导致流中断异常的原因。
内容的提问来源于stack exchange,提问作者Gabic

