部署在Azure时调用Bokun API失败,本地运行正常的问题排查求助
我最近碰到一个特别棘手的问题:在本地开发环境或者同事的机器上调用Bokun的产品库存查询API完全没问题,但部署到Azure之后就会抛出异常。先把相关代码和报错信息贴出来,再说说我已经试过的方案,想请教各位还有什么可以排查的方向?
调用Bokun API的核心代码
private async Task<IList<AvailabilityInfo>> GetProductAvailabilitiesAsync(long externalProductId, DateTime start, DateTime end, string currency, bool includeSoldOut = false, CancellationToken cancellationToken = default) { var path = $"/activity.json/{externalProductId}/availabilities?start={start:yyyy-MM-dd}&end={end:yyyy-MM-dd}&lang=EN¤cy={currency}&includeSoldOut={includeSoldOut}"; var date = Clock.Now.ToString("yyyy-MM-dd HH:mm:ss"); var text = $"{date}{_accessKey}GET{path}"; var signature = text.ToHmacSha1(_privateKey); using HttpClient client = factory.CreateClient(nameof(HttpClientNames.Bokun)); SetupRequestHeaders(client, date, signature); var response = await client.GetStringAsync(_basePath + path, cancellationToken); var result = JsonSerializer.Deserialize<IList<AvailabilityInfo>>(response); return result; } private void SetupRequestHeaders(HttpClient _client, string date, string signature) { _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("X-Bokun-Date", date); _client.DefaultRequestHeaders.Add("X-Bokun-AccessKey", _accessKey); _client.DefaultRequestHeaders.Add("X-Bokun-Signature", signature); _client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); }
HttpClientFactory的配置代码
services.ConfigureClientWithResiliency(HttpClientNames.Bokun,bokunUrl) .AddHttpMessageHandler<QuartzCorrelationIdHandler>() .ConfigurePrimaryHttpMessageHandler(h => { var handler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli }; return handler; });
部署到Azure后抛出的异常
System.Net.Http.HttpRequestException: Error while copying content to a stream.
at async TaskSystem.Net.Http.HttpClient.GetStringAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
at async Task<IList> Services.Bokun.Core.Services.BokunProductService.GetProductAvailabilitiesAsync(long externalProductId, DateTime start, DateTime end, string currency, bool includeSoldOut, CancellationToken cancellationToken) in /home/vsts/work/1/s/src/Services.Bokun.Core/Services/BokunProductService.cs:line 375
at async Task<List> .Services.Bokun.Core.Services.BokunProductService.SyncProductInstanceSeriesAsync(int productInventoryId, int? rateId, string currency, long externalProductId, BokunDuration bokunDuration, CancellationToken ct) in /home/vsts/work/1/s/src/Services.Bokun.Core/Services/BokunProductService.cs:line 279
---> System.Net.Http.HttpIOException: The response ended prematurely. (ResponseEnded)
at async ValueTask System.Net.Http.HttpConnection.FillAsync(bool async)
at async Task System.Net.Http.HttpConnection+ChunkedEncodingReadStream.CopyToAsyncCore(Stream destination, CancellationToken cancellationToken)
at async TaskSystem.Net.Http.HttpClient.GetStringAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
已经尝试过的解决方案(均无效)
- 为请求添加了gzip压缩支持,猜测是响应体积过大导致截断,但问题依旧
- 尝试将HTTP版本强制设置为1.0(参考了一些社区建议),没有解决
- 确认Azure App Service的“始终开启”功能已启用,排除了应用池回收导致的连接中断
- 运维同事检查了Frontdoor的配置,未发现明显异常
现在实在没头绪了,想问问各位大佬,还有什么可以排查的点或者可能的原因吗?比如Azure环境的网络限制、Bokun API对Azure IP的访问限制、HttpClient在Azure环境下的特殊配置问题,或者是签名生成在Azure时区下的差异?
内容来源于stack exchange




