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

解决Android应用调用ASP.Net Core Web API时出现的unexpected end of stream异常问题

解决ASP.NET Core API部署IIS时移动应用调用出现流中断异常的方案

你遇到的核心问题很明确: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警告)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:27:30