【问题标题】:Set custom timeout using Google Analytics v3 .Net class library使用 Google Analytics v3 .Net 类库设置自定义超时
【发布时间】:2018-02-21 21:33:03
【问题描述】:

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

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

设置超时的类

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() });

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

任何指针将不胜感激。我找不到与此相同问题相关的任何其他帖子。我将继续阅读源代码并尝试破译正确的方法,如果找到解决方案,我会更新这篇文章。

【问题讨论】:

    标签: c# asp.net-core google-api-dotnet-client


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哇,谈谈将简单过程过度复杂化的典型例子。我不确定我是如何错过可以直接访问 HttpClient 的……我想我被 IConfigurableHttpClientInitializer 上的评论“使用此初始化程序更改超时等默认值”并跑到了错误的兔子洞里。谢谢你,克里斯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多