使用 Google Analytics v3 .Net class 库设置自定义超时

Set custom timeout using Google Analytics v3 .Net class library

我正在尝试使用 Google 的 .Net 客户端库 (Analytics v3) 通过我的 GA 服务帐户获取数据。一切正常,除了我在向 GA API(使用客户端库)请求期间偶尔收到超时。我想调整超时逻辑(并通过库添加重试逻辑,如果可能 - 但这是一个较小的问题)。

目前我不知道如何通过客户端库修改超时设置。通过阅读他们的源代码(因为我在房子的 .net 端找不到任何类似于有用文档的东西),看起来我需要实现 "IConfigurableHttpClientInitializer"。下面是我正在考虑的示例,但我不确定它是否正确或如何将它与我现有的代码集成。我的相关代码的摘录也在下面。

Class 设置超时

public class TimeoutInitializer : IConfigurableHttpClientInitializer
{
    public void Initialize(ConfigurableHttpClient httpClient)
    {
        httpClient.Timeout = TimeSpan.FromMinutes(3);
    }
}

现有代码

private async Task<GaData> GetAnalyticsData(string profileId, DateTime begin, DateTime end, string metrics, string dimensions)
    {
        GoogleCredential credential = AnalyticsHelper.GetCredentials(options.GoogleAnalyticsOptions);

        var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = credential });
        DataResource.GaResource.GetRequest request = service.Data.Ga.Get($"ga:{profileId}", AnalyticsHelper.FormatDate(begin), AnalyticsHelper.FormatDate(end), metrics);
        if (!string.IsNullOrEmpty(dimensions))
        {
            request.Dimensions = dimensions;
        }

        return await request.ExecuteAsync();
    }

public class AnalyticsHelper
{
    public static GoogleCredential GetCredentials(AnalyticsOptions options)
    {
        using (Stream stream = new FileStream(options.ServiceAccountKeyPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            return GoogleCredential.FromStream(stream).CreateScoped(AnalyticsService.Scope.AnalyticsReadonly);
        }
    }
}

我在想

var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = credential });

将被替换为

var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = new TimeoutInitializer() });

但是,我并不肯定,也不确定如何将原始凭证逻辑与它结合起来。我考虑过创建一个新的 class 来实现 GoogleCredential,但我觉得必须有更好的方法。

任何指点将不胜感激。我找不到与同一问题相关的任何其他 post。我将继续通读源代码并尝试破译正确的方法,如果找到解决方案,我将更新此 post。

使用凭据作为初始化程序正常创建服务后:

var service = new AnalyticsService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential
});

然后直接访问HttpClient并设置超时:

service.HttpClient.Timeout = TimeSpan.FromMinutes(3);