Невозможно создать события календаря Google API (ссылка на объект не указывает на экземпляр объекта) ошибка

avatar
user3685350
1 июля 2021 в 18:31
66
1
0

Я пытаюсь получить список событий Календаря Google с помощью API календаря .NET v3.

Следующий код кажется правильным, но не работает, когда я вызываю request.Execute(); с показанной здесь ошибкой «ссылка на объект не указывает на экземпляр объекта». Я не знаю, как отладить источник ошибки или какой «объект» не задан.

        ServiceAccountCredential credentialService;

        CalendarService service;

        var certificate = new X509Certificate2("filename.p12", "notasecret", X509KeyStorageFlags.Exportable);

        credentialService = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer("name@here.iam.gserviceaccount.com")
            {
                Scopes = scopes
            }.FromCertificate(certificate));

        // Create the service.
        service = new CalendarService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credentialService,
            ApplicationName = "app name",
        });


        try
        {
            // Define parameters of request.
            EventsResource.ListRequest request = service.Events.List("primary");
            request.TimeMin = DateTime.Now;
            request.ShowDeleted = false;
            request.SingleEvents = true;
            request.MaxResults = 20;
            request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;


            **Events events = request.Execute();**
            if (events.Items != null && events.Items.Count > 0)
            {
                foreach (var eventItem in events.Items)
                {
                    string when = eventItem.Start.DateTime.ToString();
                    if (String.IsNullOrEmpty(when))
                    {
                        when = eventItem.Start.Date;
                    }

                    Item item = new Item();

                    item.Id = Guid.NewGuid().ToString();
                    item.Text = when;
                    item.Description = eventItem.Summary;

                    itemsMeetings.Add(item);

                    //Console.WriteLine("{0} ({1})", eventItem.Summary, when);
                }
            }
            else
            {
                //Console.WriteLine("No upcoming events found.");
            }
        }
        catch(Exception ex)
        {
            Console.Write(ex.Message);
        }
Источник
Ron M
1 июля 2021 в 22:12
0

Привет, мне просто любопытно, отображается ли диалоговое окно при запуске кода? чтобы убедиться, что учетные данные работают для учетной записи службы? Это также может быть полезно coderhelper.com/questions/4660142/…

user3685350
2 июля 2021 в 17:14
0

Пользовательское приглашение не выдается. Я полагаю, что мог бы проверить учетные данные, но не уверен, как бы я это сделал.

Ron M
2 июля 2021 в 18:44
0

Попробуйте заменить primary на свой точный идентификатор календаря и поделитесь своим календарем со своей служебной учетной записью и посмотрите, решит ли это проблему.

user3685350
4 июля 2021 в 19:19
0

@ Рон М, да! Это помогло, спасибо.

Ответы (1)

avatar
Ron M
5 июля 2021 в 15:16
0

Причина, по которой вы столкнулись с такой ошибкой, заключается в том, что используемый вами пример кода, основанный на официальной документации, использует учетные данные учетной записи Google для доступа к primary календарю. Хотя вы стремитесь использовать учетную запись службы для доступа к основному календарю или его изменения, service.Events.List("primary") вернет значение null, поскольку у вашей учетной записи службы нет основного календаря.

Если вы хотите обновить или получить доступ к своему календарю с помощью сервисной учетной записи, вам необходимо предоставить общий доступ к календарю для вашей сервисной учетной записи, чтобы получить доступ. Поделитесь своим календарем с кем-нибудь.

После того, как вы дали разрешение своей учетной записи службы, вам необходимо предоставить точный calendar id, к которому вы хотите получить доступ, используя свою учетную запись службы вместо primary.

Ron M
5 июля 2021 в 15:19
0

@ user3685350, я решил опубликовать это как ответ для дальнейшего использования в сообществе. Не стесняйтесь принять ответ. Таким образом, другие люди в сообществе, которые могут иметь те же проблемы, что и вы, будут знать, что их проблемы могут быть решены. Если кнопка «Принять» недоступна для вас, сообщите мне об этом. Как принять ответ