截至今天,当我们尝试使用Google Calendar V3 API更新活动时,我们收到了错误消息。
这是我们的代码:
string certificateFile = getCertificateFile();
string certificatePassword = getCertificatePassword();
string serviceAccountEmail = getServiceAccountEmail();
X509Certificate2 certificate = new X509Certificate2(AppDomain.CurrentDomain.BaseDirectory + "certs//" + certificateFile, certificatePassword, X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { Google.Apis.Calendar.v3.CalendarService.Scope.Calendar },
User = user
}.FromCertificate(certificate));
Google.Apis.Calendar.v3.CalendarService service = new Google.Apis.Calendar.v3.CalendarService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Test",
});
try
{
Event evv = service.Events.Get(user, "6ebr4dp452m453n468movuntag").Execute();
EventsResource.UpdateRequest ur = new EventsResource.UpdateRequest(service, evv, user, evv.Id);
ur.Execute();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
错误消息是"指定的值不是有效的带引号的字符串。 "
这是始终有效的基本代码。我们仍然可以查询和插入事件。由于某种原因,更新刚刚停止工作?
其他人得到这个吗?
答案 0 :(得分:2)
我发现问题所在:Google API的ETag功能似乎已被打破。
为了解决这个问题,我必须从google-api-dotnet-client Downloads下载.NET Google API客户端库的源代码,并在ClientServiceRequest.cs的第189行注释对方法AddETag()的调用;该方法添加了当前导致问题的If-Match ETag标头。此文件位于GoogleApis项目中。
public HttpRequestMessage CreateRequest(Nullable<bool> overrideGZipEnabled = null)
{
var builder = CreateBuilder();
var request = builder.CreateRequest();
object body = GetBody();
request.SetRequestSerailizedContent(service, body, overrideGZipEnabled.HasValue
? overrideGZipEnabled.Value : service.GZipEnabled);
//AddETag(request);
return request;
}
有关Google API如何使用ETag和If-Match标头的详细信息,请参阅Protocol Reference: Updating Entries。
答案 1 :(得分:1)
Calendar API中的问题已修复,因此无需使用此解决方法!
请不要使用上述建议。虽然它有效但它实际上会消除库中etag的一个重要特征。可在以下位置找到更好的解决方案:https://codereview.appspot.com/96320045/
感谢diegog为你的解决方案,我很确定它帮助了今天被困的几个用户。