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

.NET 3.1微服务上传大XML报操作取消错误的解决求助

解决.NET 3.1微服务大XML上传时"The operation was canceled"错误

这个错误的核心原因是HttpClient默认超时时间(100秒)不足以覆盖大XML文件上传+后端处理的总耗时——即便后端最终完成了处理,客户端会因为超时提前抛出取消操作的异常。结合你的代码和场景,给出以下解决方案:

1. 调整HttpClient的超时配置

HttpClient的Timeout属性默认是100秒,你需要根据大XML的实际处理耗时,设置一个足够长的超时值。

方式一:依赖注入时配置(推荐)

如果你的_httpClient是通过依赖注入获取的,在Startup.cs的服务注册阶段配置:

services.AddHttpClient("GatewayHttpClient", client =>
{
    client.BaseAddress = new Uri(_apiGatewayUrl);
    // 设置超时时间,比如5分钟,根据实际情况调整
    client.Timeout = TimeSpan.FromMinutes(5);
});

之后在使用时通过命名客户端获取:

private readonly HttpClient _httpClient;

public YourService(IHttpClientFactory httpClientFactory)
{
    _httpClient = httpClientFactory.CreateClient("GatewayHttpClient");
}

方式二:直接修改现有HttpClient实例

如果是直接实例化的HttpClient,在调用PostAsync前修改超时:

// 在创建formContent之后、发起请求之前设置
_httpClient.Timeout = TimeSpan.FromMinutes(5);
var request = await _httpClient.PostAsync($"{_apiGatewayUrl}mensajeria/cfdi/createFactura", formContent);

2. 检查并调整网关/下游服务的超时与文件限制

仅仅调整客户端超时还不够,网关和处理XML的下游服务也可能存在超时或文件大小限制,导致请求被中断:

下游服务(处理XML的服务)配置

在下游服务的Startup.cs中添加以下配置,放宽请求超时和上传文件大小限制:

// 配置Kestrel服务器
services.Configure<KestrelServerOptions>(options =>
{
    // 设置最大请求体大小,根据文件实际大小调整,int.MaxValue表示无限制
    options.Limits.MaxRequestBodySize = int.MaxValue;
    // 设置请求超时时间
    options.Limits.RequestTimeout = TimeSpan.FromMinutes(5);
});

// 如果部署在IIS上,还需要配置IISServerOptions
services.Configure<IISServerOptions>(options =>
{
    options.MaxRequestBodySize = int.MaxValue;
    options.RequestTimeout = TimeSpan.FromMinutes(5);
});

网关配置(如果使用Ocelot等网关)

如果用Ocelot作为网关,需要在路由配置中增加超时设置:

"Routes": [
    {
        "DownstreamPathTemplate": "/mensajeria/cfdi/createFactura",
        "DownstreamScheme": "https",
        "DownstreamHostAndPorts": [
            {
                "Host": "your-downstream-service",
                "Port": 443
            }
        ],
        "UpstreamPathTemplate": "/mensajeria/cfdi/createFactura",
        // 设置网关路由超时(5分钟,单位毫秒)
        "Timeout": 300000
    }
]

3. 代码细节优化

你的现有代码中StreamContent的使用是正确的,但可以增加超时异常的针对性处理,避免模糊的错误提示:

try
{
    var request = await _httpClient.PostAsync($"{_apiGatewayUrl}mensajeria/cfdi/createFactura", formContent);
    request.EnsureSuccessStatusCode();
    return JsonSerializer.Deserialize<int>(
        await request.Content.ReadAsStringAsync(),
        new JsonSerializerOptions
        {
            PropertyNameCaseInsensitive = true
        }
    );
}
catch (TaskCanceledException ex)
{
    // 判断是否是超时导致的取消(而非主动取消)
    if (!ex.CancellationToken.IsCancellationRequested)
    {
        // 自定义超时处理逻辑,比如记录日志、返回明确错误码
        throw new Exception("请求超时,请稍后重试", ex);
    }
    throw;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:03:43