1

Я использую сервис Google Calendar api для доступа к календарю пользователя, и он отлично работает для меня в моем локальном, но он не работает на сервере ниже это код, который отлично работает в моем локальном.Как решить проблему «Одна или несколько ошибок» при использовании Google Calendar api

public ActionResult AddGoogleEvent() 
{   
    UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
     new ClientSecrets 
     { 
      ClientId = clientid, 
      ClientSecret = clientsecret, 
     }, 
     new[] { CalendarService.Scope.Calendar }, 
     "user", 
     CancellationToken.None).Result; 

    var service = new CalendarService(new BaseClientService.Initializer(){ 
     HttpClientInitializer = credential, 
     ApplicationName = "sampleappilication" 
     }); 

    Google.Apis.Calendar.v3.Data.Event event1 = new Google.Apis.Calendar.v3.Data.Event() 
    { 
     Summary = "Appointment", 
     Location = location, 
     Start = new Google.Apis.Calendar.v3.Data.EventDateTime() 
     { 
      DateTime = new DateTime(Convert.ToInt32(yy), Convert.ToInt32(mn), Convert.ToInt32(dy), Convert.ToInt32(sthour), Convert.ToInt32(stminute), 0), 
      TimeZone = location 
     }, 
     End = new Google.Apis.Calendar.v3.Data.EventDateTime() 
     { 
      DateTime = new DateTime(Convert.ToInt32(yy), Convert.ToInt32(mn), Convert.ToInt32(dy), Convert.ToInt32(ethour), Convert.ToInt32(etminute), 0), 
      TimeZone = "America/Los_Angeles" 
     }, 
     Recurrence = new String[] {"RRULE:FREQ=WEEKLY;BYDAY=MO"}, 
     Attendees = new List<Google.Apis.Calendar.v3.Data.EventAttendee>() 
     { 
      new Google.Apis.Calendar.v3.Data.EventAttendee() { Email = attendencess } 
     } 
    }; 

    Google.Apis.Calendar.v3.Data.Event thisevent = service.Events.Insert(event1, "primary").Execute(); // Another error. "Does not contain a definition for Fetch" 

    string newEventID = thisevent.Id; 

    Session["Accepted"] = "Accepted"; 
    return RedirectToAction("Eventconfirm"); 
} 

Исключение

Доступ к пути 'Google.Apis.Auth' отказано. StackTrace: в Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSu ступы (Tasktask) Атмический rosoft.Runtime.Compi lerServices.TaskAwai ter.HandleNonSuccess (Task задача) в Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker .d__1.MoveNe xt() в C: \ Users \ mdril \ Documents \ GitHub \ google-api-dotnet-client \ Src \ GoogleApis.Auth.Dot Net4 \ OAuth2 \ GoogleWe bAuthorizationBroker .cs: линия 59 Источник: Microsoft.Threading.Tasks TargetSite: Пустота ThrowForNonSuccess (System.Threading.Tasks.Task)

Может ли один предложить, как это исправить

+1

«Не работает» довольно расплывчато - что именно происходит не так, и где? (Я надеюсь, что у вас есть трассировка стека исключений где-нибудь ...) –

+0

да при проверке в файле журнала я получаю следующее исключение. Произошла одна или несколько ошибок. StackTrace:. В System.Threading.Tasks.Task'1.GetResultCore (Boolean waitCompletionNotification) в O365_APIs_Start_ASPNET_MVC.Controllers.ICalendarController d__104.MoveNext() в D: \ O365Calender_App_New \ O365Calender_App \ O365-APIs-Start-ASPNET -MVC \ Контроллеры \ ICalendarController.cs: строка 4678 Источник: mscorlib TargetSite: TResult GetResultCore (Boolean) --------------------------------- -------------------------- –

+0

Во-первых, это должно быть в вопросе, а не в комментарии - и далее вы должны найти * реальный * Исключительное исключение в 'InnerExceptions'. Без этой информации вам будет очень сложно помочь. –

ответ

1
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
     new ClientSecrets 
     { 
      ClientId = clientid, 
      ClientSecret = clientsecret, 
     }, 
     new[] { CalendarService.Scope.Calendar }, 
     "user", 
     CancellationToken.None).Result; 

По умолчанию этот код использует FileDataStore для хранения ваших учетных данных. FileDataStore будет по умолчанию хранить учетные данные в% appData%. Мой учебник по filedatastore можно найти here

доступ к пути «Google.Apis.Auth» Отказано

Возможно означает, что ваш сервер не имеет доступа для записи в этот путь. Вы можете сделать что-то подобное, чтобы изменить путь хранения учетных данных.

UserCredential credential; 
using (var stream = new FileStream(clientSecretsJsonFilePath 
           ,FileMode.Open 
           ,FileAccess.Read)) 
    { 
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(stream).Secrets, 
    new[] { CalendarService.Scope.Calendar }, 
    "LookIAmAUniqueUser", 
    CancellationToken.None, 
    new FileDataStore(@"c:\datastore",true)        
).Result; 
    } 

В качестве альтернативы вы можете создать свою собственную реализацию idatastore и хранить учетные данные, как бы вы хотели

+0

Hi Dalm, У меня проблема с DriveService.Scope.Drive, в котором пространство имен я получаю это –

+0

You вам это не нужно, вы используете календарь Google. Я только что скопировал код, и вы могли его исправить. Я сделал это для вас. – DaImTo

+0

Спасибо Далм, его работы для меня –

1

GoogleWebAuthorizationBroker.AuthorizeAsync работает в консольном приложении (или локально в Dev машине), но и для веба-приложения вам нужен веб-поток.

Пожалуйста, проверьте эту связь:

http://www.c-sharpcorner.com/article/implementing-oauth2-0-authorization-for-google-in-asp-net/

https://stackoverflow.com/a/46604699/6080079

первый из них, чтобы получить маркер доступа, а второй один, чтобы получить услугу от этого маркера.

Надеюсь, что эта помощь!