使用 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);
我正在尝试使用 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);