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

.Net Core 3.1 API部署Docker调用Oracle存储过程无响应求助

可能的故障原因及解决方案

1. Kestrel 服务器默认请求超时限制

ASP.NET Core 默认使用 Kestrel 作为托管服务器,其默认的最长请求持续时间为 120 秒,远低于你存储过程的 20 分钟执行时长。你部署到 IIS 时会默认继承 IIS 站点的超时配置,所以运行正常,但容器环境下未调整 Kestrel 配置就会出现请求被提前中断的问题。

  • 解决方法:在 Program.cs/Startup.cs 中配置 Kestrel 的请求超时,示例代码:
builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(25);
    options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(25);
});
// 同时为对应接口配置专属的取消令牌超时
app.UseWhen(context => context.Request.Path.StartsWithSegments("/你的接口路由前缀"), appBuilder =>
{
    appBuilder.Use(async (context, next) =>
    {
        context.RequestAborted = new CancellationTokenSource(TimeSpan.FromMinutes(25)).Token;
        await next();
    });
});

另外需要显式设置 Oracle 命令的 CommandTimeout 为 1500 秒(25分钟),避免 ODP.NET 层面超时:

command.CommandTimeout = 1500;

2. Windows Docker NAT 网络闲置连接超时

Windows Server Docker 引擎默认的 NAT 网络闲置连接超时为 240 秒,长耗时请求执行过程中连接无数据传输,NAT 端口映射表项过期后,Oracle 返回的数据包无法被转发到容器内,导致 API 收不到响应。

  • 解决方法:修改容器内的 TCP 保活配置,在 Dockerfile 中添加以下命令(基于 Windows 容器镜像):
RUN reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 /f
RUN reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 /f
RUN reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f

以上配置将 TCP 保活探测间隔改为 30 秒,主动维持连接存活,避免 NAT 表项过期。

3. 中间网络设备超时

如果你的 Oracle 数据库和 Docker 宿主机之间存在防火墙、WAF 或者反向代理设备,这类设备通常会对闲置超过 5-10 分钟的 TCP 连接主动断开,需要在对应的网络设备上配置针对 Oracle 服务端口(默认 1521)的长连接超时规则,或者依赖上述 TCP 保活配置自动维持连接存活。

内容的提问来源于stack exchange,提问作者Ferest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:27:03