Я следую этому учебнику Google, и он не работает operation.PollUntilCompleted()
.
Исключением, которое я получаю, является
'operation.Result' threw an exception of type 'System.InvalidOperationException' Google.Cloud.Retail.V2.SetInventoryResponse {System.InvalidOperationException}
с сообщением об ошибке
"Operation has not completed."
Вот код, который я выполнил из руководства. Оставляю здесь для удобства:
/// <summary>
/// Call the Retail API to set product inventory.
/// </summary>
/// <param name = "product">The actual product.</param>
public static void SetProductInventory(string productName)
{
var setInventoryRequest = GetSetInventoryRequest(productName);
var client = ProductServiceClient.Create();
var operation = client.SetInventory(setInventoryRequest);
Console.WriteLine("Set inventory. Please, wait.");
Console.WriteLine();
operation.PollUntilCompleted(); // <<<<< This line causes the exception.
}
}
/// <summary>
/// The set inventory tutorial class.
/// </summary>
public static class SetInventoryTutorial
{
[Runner.Attributes.Example]
public static void PerformSetInventoryOperation()
{
string projectId = Environment.GetEnvironmentVariable("GOOGLE_PROJECT_ID");
// Create product.
Product createdProduct = CreateProductSample.CreateRetailProductWithFulfillment(projectId);
// Set inventory for product.
SetInventorySample.SetProductInventory(createdProduct.Name);
// Get product.
Product product = GetProductSample.GetRetailProduct(createdProduct.Name);
Console.WriteLine($"Product Price Info: {product.PriceInfo}");
Console.WriteLine();
// Delete product.
DeleteProductSample.DeleteRetailProduct(createdProduct.Name);
}
Я могу успешно создать продукт. Когда я пытаюсь установить инвентарь, в строке operation.PollUntilCompleted()
выдается исключение.
Можете ли вы посоветовать, как действовать? Заранее спасибо.
--- Обновлять ---
Вот репозиторий с примером приложения, воспроизводящего трассировку стека того же исключения.
(Извините, что ранее вставил неверную информацию.) Вот трассировка стека исключения .
Я попробовал другой метод, AddLocalInventoriesAsync
, и он выдает то же сообщение об ошибке.
Конечно, я только что загрузил его. Спасибо.
Эта трассировка стека выглядит так, как будто в ней есть все, чего вообще нет в учебнике — это трассировка стека ASP.NET Core, а учебник — это просто консольное приложение, не так ли?
Правильный. Учетные данные аутентификации, переменные среды и все такое было применено и работает. Я предоставил больше разрешений, чем мне действительно было нужно.
Но я хочу сказать, что вы представили код из руководства так, как будто это код, который дает сбой, но похоже, что на самом деле это совершенно другая кодовая база, в которой вы наблюдаете ошибку. Пожалуйста, предоставьте минимальный воспроизводимый пример кода, который не работает.
Я не уверен, что вы внимательно читали мои комментарии. Я ничего не говорил о разрешениях IAM и т. д. и не задавался вопросом, правильно ли вы это настроили. Я сказал, что код, который вы включили в вопрос, похоже, не является кодом, создавшим опубликованную вами трассировку стека. Очень сложно диагностировать ошибку, если мы не видим код, который ее создает. Пожалуйста, опубликуйте минимальный воспроизводимый пример, который приводит к ошибке, которую вы видите.
Спасибо, Джон, за ответ. Для полного воспроизведения проблемы этому примеру приложения требуется учетная запись Google, включенный API поиска розничной торговли и разрешения на чтение и запись (IAM). Если вас это устраивает, я опубликую приложение здесь в своем следующем комментарии. Спасибо.
Нет, пожалуйста, не оставляйте это в комментарии — вместо этого отредактируйте свой вопрос. (И да, у меня все это настроено. Чтобы дать контекст, я занимаюсь сопровождением клиентских библиотек Google Cloud.)
Ссылка, которую вы пометили как «трассировка стека исключения», не является трассировкой стека. Это снимок экрана отладчика, но он не содержит фактической трассировки стека. Из-за таких вещей вам намного сложнее помочь. Кроме того, было бы намного лучше, если бы в вопросе был минимальный пример, а не в отдельном репо. Я клонирую ваш репозиторий, чтобы попытаться воспроизвести его, но, пожалуйста, прочитайте jonskeet.uk/links/stack-hints
Я только что запустил код в вашем репозитории, и он работал нормально — без исключений. Это реальный код, который вызывает проблему? (Опять же, это полностью отличается от вашей предыдущей трассировки стека.)
Если вы видите исключение в отладчике только при проверке свойства Result
объекта operation
, я не удивлён, что вы это видите, и это не ошибка. Первоначальная операция не завершена, поэтому правильное использование operation.Result
вызывает исключение. Но это не то же самое, что сам код выдает исключение.
Ты прав, Джон. Мы увидели исключение в отладчике только при проверке свойства Result
. С другой стороны, мы тоже работали с AddLocalInventories
, но не понимали, как проверять обновленные запасы у нас Product catalog
. Благодаря вашим советам мы наконец смогли выяснить, как использовать (и проверить) оба метода. Большое спасибо!
Хорошо, я добавлю это как ответ.
Покопавшись в комментариях, оказывается, что сам код не выбрасывал исключение. Вместо этого исключение было замечено только в отладчике при проверке свойства Result
незавершенной операции. Это ведет себя точно так, как задокументировано - когда операция не завершена, попытка получить доступ к ее Result
свойству выдает InvalidOperationException
.
Самый простой способ увидеть результат операции после ее завершения — использовать возвращаемое значение PollUntilCompleted
:
operation = operation.PollUntilCompleted();
После завершения этого оператора проверка operation
в отладчике должна показать результат.
В общем, я бы советовал не беспокоиться об исключениях, которые отображаются только при проверке свойств в отладчике: если ваш код не оценивает то же свойство, вы не столкнетесь с этим исключением.
Не могли бы вы включить полную трассировку стека?