我正在尝试使用Google Calendar API v3,但是在运行代码时遇到问题,它总是会给我该错误:


  mscorlib.ni.dll中发生类型'System.AggregateException'的异常,但未在用户代码中处理
  附加信息:发生一个或多个错误。


我不知道为什么会这样,它也应该工作。这是它的屏幕截图:
c# - 适用于UWP Windows 10应用程序的Google Calendar API发生一个或多个错误-LMLPHP

我的代码也是:

 UserCredential credential;
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                   new Uri("ms-appx:///Assets/client_secrets.json"),
                    Scopes,
                    "user",
                    CancellationToken.None).Result;


            // Create Google Calendar API service.
            var service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

        var calendarService = new CalendarService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential,
            ApplicationName = "Windows 10 Calendar sample"
        });
        var calendarListResource = await calendarService.CalendarList.List().ExecuteAsync();


如果至少可以帮助您通过REST API调用它,那也很好,但是您必须考虑到它是UWP,因此它还有另一种使它正常工作的方法。
正如我已经尝试通过REST API一样,但是我始终会收到“请求错误代码400”。

感谢您的关注。

最佳答案

面向.NET的Google API客户端库目前不支持UWP。因此,我们现在不能在UWP应用中使用Google.Apis.Calendar.v3 Client Library。有关更多信息,请参见类似的问题:Universal Windows Platform App with google calendar

要在UWP中使用Google Calendar API,我们可以通过REST API对其进行调用。要使用REST API,我们需要先授权请求。有关如何授权请求的信息,请参见Authorizing Requests to the Google Calendar APIUsing OAuth 2.0 for Mobile and Desktop Applications

获得访问令牌后,我们可以像下面这样调用Calendar API:

var clientId = "{Your Client Id}";
var redirectURI = "pw.oauth2:/oauth2redirect";
var scope = "https://www.googleapis.com/auth/calendar.readonly";
var SpotifyUrl = $"https://accounts.google.com/o/oauth2/auth?client_id={clientId}&redirect_uri={Uri.EscapeDataString(redirectURI)}&response_type=code&scope={Uri.EscapeDataString(scope)}";
var StartUri = new Uri(SpotifyUrl);
var EndUri = new Uri(redirectURI);

// Get Authorization code
WebAuthenticationResult WebAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, StartUri, EndUri);
if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success)
{
    var decoder = new WwwFormUrlDecoder(new Uri(WebAuthenticationResult.ResponseData).Query);
    if (decoder[0].Name != "code")
    {
        System.Diagnostics.Debug.WriteLine($"OAuth authorization error: {decoder.GetFirstValueByName("error")}.");
        return;
    }

    var autorizationCode = decoder.GetFirstValueByName("code");


    //Get Access Token
    var pairs = new Dictionary<string, string>();
    pairs.Add("code", autorizationCode);
    pairs.Add("client_id", clientId);
    pairs.Add("redirect_uri", redirectURI);
    pairs.Add("grant_type", "authorization_code");

    var formContent = new Windows.Web.Http.HttpFormUrlEncodedContent(pairs);

    var client = new Windows.Web.Http.HttpClient();
    var httpResponseMessage = await client.PostAsync(new Uri("https://www.googleapis.com/oauth2/v4/token"), formContent);
    if (!httpResponseMessage.IsSuccessStatusCode)
    {
        System.Diagnostics.Debug.WriteLine($"OAuth authorization error: {httpResponseMessage.StatusCode}.");
        return;
    }

    string jsonString = await httpResponseMessage.Content.ReadAsStringAsync();
    var jsonObject = Windows.Data.Json.JsonObject.Parse(jsonString);
    var accessToken = jsonObject["access_token"].GetString();


    //Call Google Calendar API
    using (var httpRequest = new Windows.Web.Http.HttpRequestMessage())
    {
        string calendarAPI = "https://www.googleapis.com/calendar/v3/users/me/calendarList";

        httpRequest.Method = Windows.Web.Http.HttpMethod.Get;
        httpRequest.RequestUri = new Uri(calendarAPI);
        httpRequest.Headers.Authorization = new Windows.Web.Http.Headers.HttpCredentialsHeaderValue("Bearer", accessToken);

        var response = await client.SendRequestAsync(httpRequest);

        if (response.IsSuccessStatusCode)
        {
            var listString = await response.Content.ReadAsStringAsync();
            //TODO
        }
    }
}

10-02 01:23
查看更多