Ошибка организационного подразделения API каталога Google 404

Я вызываю API-интерфейсы получения, обновления и удаления для организационного подразделения через клиентскую библиотеку Google .net, но получаю 404. Я использовал Fiddler и увидел, что URL-адрес запроса имеет неверный формат. Вместо пути к организационному подразделению я вижу в URL-адресе строку {/orgUnitPath*}, а идентификатор клиента заменяется фактическим идентификатором клиента. Я сделал этот запрос с фактическим путем к организационному подразделению в Fiddler, и он работает нормально.

Путь моего организационного подразделения — ABC/IT, и я предполагаю, что есть некоторая проблема с инициализацией повторяемой строки, потому что мои API-интерфейсы вставки и списка работают нормально:

Repeatable<string> rep = new Repeatable<string>(new List<string>{orgUnitPath});

OrgunitsResource.GetRequest gr = service.Orgunits.Get(GetGoogleUser(ConfigManager.AdminIdentity, accessToken).CustomerId, rep);

OrgUnit orgUnit = gr.Fetch();

Я делаю что-то не так здесь?

Мой новый код после обновления клиентской библиотеки:

public OrgUnit GetGoogleOrganizationUnit(string orgUnitPath, string accessToken)
        {
            AccessToken = accessToken;
            var service = new DirectoryService(GetGoogleServiceClient());

            Repeatable<string> rep = new Repeatable<string>(new List<string> { orgUnitPath });

            OrgunitsResource.GetRequest gr = service.Orgunits.Get(GetGoogleUser(ConfigManager.AdminIdentity, accessToken).CustomerId, rep);

            OrgUnit orgUnit = gr.Execute();

            return orgUnit;
        }

Ниже приведена трассировка стека:

[JsonReaderException: Error parsing NaN value. Path '', line 0, position 0.]
   Newtonsoft.Json.JsonTextReader.ParseNumberNaN() +97
   Newtonsoft.Json.JsonTextReader.ParseValue() +400
   Newtonsoft.Json.JsonTextReader.ReadInternal() +35
   Newtonsoft.Json.JsonTextReader.Read() +20
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter) +74
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) +442
   Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) +687
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) +111
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, JsonSerializerSettings settings) +66
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value) +42
   Google.Apis.Json.NewtonsoftJsonSerializer.Deserialize(String input) in c:\code.google.com\google-api-dotnet-client\default_3\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis\Apis\Json\NewtonsoftJsonSerializer.cs:72
   Google.Apis.Services.<DeserializeError>d__9.MoveNext() in c:\code.google.com\google-api-dotnet-client\default_3\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis\Apis\Services\BaseClientService.cs:357

[GoogleApiException: An Error occurred, but the error response could not be deserialized]
   BLL.GoogleAPIManagerBLL.GetGoogleOrganizationUnit(String orgUnitPath, String accessToken) in c:\Projects\FGPortal\BLL\GoogleAPIManagerBLL.cs:504
   Application.ManageOrgUnits.gvorgunits_RowCommand(Object sender, GridViewCommandEventArgs e) in c:\Projects\FGPortal\Application\ManageOrgUnits.aspx.cs:29
   System.Web.UI.WebControls.GridView.OnRowCommand(GridViewCommandEventArgs e) +111
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +73
   System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +89
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +88
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +156
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642898
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

person AdnanQ    schedule 23.09.2013    source источник


Ответы (3)


Во-первых, вы используете старую версию библиотеки. Выполните следующие действия с помощью NuGet:

А затем попробуйте сделать следующее:

OrgUnit orgUnit = service.Orgunits.Get(CustomerId).Execute();

person peleyal    schedule 23.09.2013
comment
Я получаю сообщение об ошибке при попытке установить пакет: вы пытаетесь установить этот пакет в проект, предназначенный для «.NETFramework, версия = v4.0», но пакет не содержит ссылок на сборки, совместимых с этой платформой. - person AdnanQ; 24.09.2013
comment
Когда я установил пакеты, у меня начались конфликты для .net framework 4.0, даже с перенаправлениями привязки сборки в web.config. - person AdnanQ; 24.09.2013
comment
Наконец, я заработал, удалив перенаправления и ссылки и снова установив пакет. Нет перегрузки с одним аргументом для получения orgunit, поэтому я попробовал с двумя и получил ошибку JsonReaderException: Error parsing NaN value. Путь '', строка 0, позиция 0. - person AdnanQ; 24.09.2013
comment
Не могли бы вы прикрепить трассировку стека? Какая точная ошибка? Обновите также проблему и добавьте новый код, который у вас есть. Возможно, на самом деле это хороший совет, чтобы начать новый проект, ориентированный на .NET 4.0 (или 4.5), и установить пакеты NuGet ПРЕДВАРИТЕЛЬНОЙ ВЕРСИИ. - person peleyal; 24.09.2013
comment
Я обновил проблему с новым кодом и трассировкой стека. У меня уже есть проект, ориентированный на .Net 4.0. - person AdnanQ; 25.09.2013
comment
Я думаю, что проблема все еще связана с URL-адресом запроса, следующий URL-адрес запроса: /admin/directory/v1/customer/A152seig3/orgunits%7B/orgUnitPath*%7D Я предполагаю, что когда запрос выполняется в течение этого времени, он анализируется что приводит к исключению - person AdnanQ; 25.09.2013

У меня такая же проблема. Но проблема была с orgunitpath и моим повторяемым параметром. orgunitpath был в формате "/ABC/IT". Как только я изменил его на «ABC/IT», у меня все заработало. Также была небольшая разница в том, как я инициализировал Repeatable.

Я напрямую использовал список строк вместо повторяемого параметра.

List<string> list = new List<string>();

list.Add("ABC/IT");

OrgunitsResource.GetRequest orgUnitRequest = googleAppsOAuthService.Orgunits.Get(superAdminImmutableId, list);

Google.Apis.Admin.Directory.directory_v1.Data.OrgUnit orgUnit = orgUnitRequest.Execute();"
person Thomas    schedule 11.11.2015
comment
К вашему сведению, вы также можете передать строку, вам не нужно создавать список и добавлять 1 элемент. - person Mathias Maes; 20.02.2020

Наконец, я использовал операции REST для достижения этого, дайте мне знать, если кто-нибудь найдет решение. Ниже приведен код:

public OrgUnit GetGoogleOrganizationUnit(string orgUnitPath, string accessToken)
        {
            AccessToken = accessToken;
            var service = new DirectoryService(GetGoogleServiceClient());

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("https://www.googleapis.com/admin/directory/v1/customer/{0}/orgunits/{1}", GetGoogleUser(ConfigManager.AdminIdentity, accessToken).CustomerId, HttpUtility.UrlEncode(orgUnitPath)));
        request.Method = "GET";
        request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + accessToken);

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream());

        var jLinq = JObject.Parse(sr.ReadToEnd());

        OrgUnit orgUnit = new OrgUnit();

        orgUnit.Kind = jLinq["kind"].ToString();
        orgUnit.ETag = jLinq["etag"].ToString();
        orgUnit.Name = jLinq["name"].ToString();
        orgUnit.Description = jLinq["description"].ToString();
        orgUnit.OrgUnitPath = jLinq["orgUnitPath"].ToString();
        orgUnit.ParentOrgUnitPath = jLinq["parentOrgUnitPath"].ToString();
        orgUnit.BlockInheritance = Convert.ToBoolean(jLinq["blockInheritance"]);

        return orgUnit;
    }
person AdnanQ    schedule 28.09.2013