控制台应用中的最大并行任务数,以及调用 API 时如何处理"Error while copying content to stream"



我正在研究一个集成,该集成处理几个大型数据集(大约300万条记录左右,每天都在增长(,这些数据集以块的形式从供应商OData API中提取。当我在本地运行它/调试时,集成将运行完成而不会出错。但是,一旦我将其放在我们的 PROD 服务器上,它有时会在给定的数据块上出现"将内容复制到流时出错"而失败。我很难弄清楚原因,可能需要一些帮助。

每个请求都包装在 using 语句中,并且应该干净地释放自身。通常,确实如此。同样,这一切都在我的本地机器上完美运行,但是服务器在拉取数百万条记录后遇到了一些麻烦。我几乎在每个步骤都添加了额外的日志记录以捕获特定错误,但仍然不清楚如何处理(或避免(此错误。它根本不一致...完全间歇性和不一致。

引发错误的代码:

using (WebRequestHandler webRequestHandler = new WebRequestHandler())
{
using (HttpClient httpClient = new HttpClient(webRequestHandler))
{
httpClient.Timeout = TimeSpan.FromMinutes(15);
ConfigureJsonClient(httpClient, syncConfig.ApiEndpoint, syncConfig.ApiAuthKey);
apiCommand = "http://foo/with/filtering";
responseMessage = Task.Run(async () => await httpClient.GetAsync(apiCommand)
.ConfigureAwait(true)).Result;
}
}

错误:

API Error Occurred - RETRYING... Foo: 2 | API CALL: https://foo... | EXCEPTION: One or more errors occurred. | INNER EXCEPTION: Error while copying content to a stream. | STACKTRACE:    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at FooNamespace.Processor.GetDataFromApi(SyncConfig syncConfig, String collection, List`1 nonDatedCollectionList, Int32 skipIndex, Int32 retryCount, Int32 taskId)

我还尝试运行尽可能多的并行任务,以使用 skip/take 将这些大型数据集拉入预定义的块(数据页(中。无论我做什么,即使是在本地,我可以并行启动的最大任务数都是 40。此限制是否有原因?

并行任务在命中 API 时是否有可能以某种方式相互冲突?这些应该显示为完全独立的隔离调用...

非常感谢任何和所有的帮助。

我有一个类似的异常Error while copying content to a stream.关于内部例外,我有System.IO.IOException: The decryption operation failed.我发现服务器正在发送没有标头content-encoding: gzip压缩的内容。更改 de 默认值 上AutomaticDecompression属性 上HttpClientHandler解决问题。

HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.AutomaticDecompression = DecompressionMethods.All;
using (var client = new HttpClient(httpClientHandler))

最新更新