【发布时间】: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