Основная функция моего приложения - изменить пароль пользователя Google G-Suite, используя пакет nuget Google.Apis.Admin.Directory.directory_v1.
Вызов API работает 95% времени (и сбрасывает пароль целевого пользователя), но время от времени вызов API выдает исключение с текстом сообщения:
Precondition Failed [412] Ошибки [Message [Precondition Failed] Местоположение [If-Match - header] Reason [ conditionNotMet] Домен [global]]
Я провел много исследований, и кажется, что заданное клиентом предварительное условие включается в вызов (REST?), который выполняет API к серверу API Google, и сервер определяет, что условие не выполняется (см. https://tools.ietf.org/html/rfc7232#section -4.2 ) или состояние изменяемого объекта является плохим (https://developers.google.com/calendar/v3/errors) Странно то, что все работает почти все время, но иногда терпит неудачу. Похоже, что это какая-то ошибка, основанная на ресурсе (слишком много вызовов было отправлено в последнее время, слишком много пользователей лицензировано в домене) или, возможно, неверные данные (неверный или отсутствующий пароль, плохой пользователь) или даже разрешения (пользователь входит в группу). / OU, которым можно управлять). Но сообщение об ошибке ничего не дает при включенном go, и я в основном исключил наиболее очевидные из возможных возможностей. Я погуглил точное сообщение и нашел множество людей с похожими жалобами, но без документированных причин.
Исправление из оригинала: я могу перехватывать REST-вызовы с помощью Fiddler (с настроенным захватом https), но я не могу ' Воспроизвести исходную ошибку во время захвата, так что это мало поможет.
Есть предложения по воспроизведению и / или устранению проблемы?
Вот код (пожалуйста, игнорируйте любые очевидные опечатки - мне пришлось вырезать / вставить / объединить несколько источников, чтобы собрать небольшой простой пример) - реальный код определенно работает почти все время:
{
userEmail = googleUser + "@" + domain; // e.g. BobSmith@myGoogleDomain.com
// service is an instance of Google.Apis.Admin.Directory.directory_v1.DirectoryService
var userget = service.Users.Get(userEmail);
User userob = userget.Execute();
userob.ChangePasswordAtNextLogin = false;
userob.Password = password;
patchRequest=service.Users.Patch(userob, userEmail);
patchRequest.Execute();
}
catch (Exception e)
{}