You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

部署在Azure时调用Bokun API失败,本地运行正常的问题排查求助

部署在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&currency={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 Task System.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 Task System.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

火山引擎 最新活动