#c# #asp.net-mvc #azure #asp.net-core
#c# #asp.net-mvc #azure #asp.net-core
Вопрос:
У меня есть приложение asp .net core mvc с несколькими внешними запросами API, использующими Azure Service Management API. https://learn.microsoft.com/en-us/rest/api/resources/providers/register#code-try-0 в этом запросе api регистрируются любые пространства имен. Но для завершения требуется больше времени. Первоначально значение атрибута json ответа равно ‘Незарегистрированному’, после приведенного выше запроса POST отправьте его значение, установленное на ‘Регистрация’. До завершения требуется 2-3 минуты. Наконец, значение ответа установлено в ‘Registered’.
HttpClient client = new HttpClient();
HttpRequestMessage request2 = new HttpRequestMessage(HttpMethod.Post, String.Format(Constants.MicrosoftManagedProviderRegisterApi, subscription));
request2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
// Ensure a successful response
HttpResponseMessage response2 = await client.SendAsync(request2);
response2.EnsureSuccessStatusCode();
Вот как я отправляю запрос API. Я хочу знать, как мне продолжать ждать внутри контроллера, пока значение атрибута json ответа не будет установлено в ‘Registered’. Любой простой метод для достижения этого?
Пожалуйста, смотрите тип ответа ниже.
{
"id": "/subscriptions/***/providers/Microsoft.ManagedServices",
"namespace": "Microsoft.ManagedServices",
"authorization": "",
"resourceTypes": [],
"registrationState": "Unregistered",
"registrationPolicy": "RegistrationRequired"
}
{
"id": "/subscriptions/***/providers/Microsoft.ManagedServices",
"namespace": "Microsoft.ManagedServices",
"authorization": "",
"resourceTypes": [],
"registrationState": "Registering",
"registrationPolicy": "RegistrationRequired"
}
{
"id": "/subscriptions/***/providers/Microsoft.ManagedServices",
"namespace": "Microsoft.ManagedServices",
"authorization": "",
"resourceTypes": [],
"registrationState": "Registered",
"registrationPolicy": "RegistrationRequired"
}
Комментарии:
1. Прочитайте ответное сообщение, если оно не равно «зарегистрировано», затем повторите вызов.
if
Инструкция сloop
и небольшое ожидание перед следующим вызовом api для предотвращения регулирования, похоже, все, что вам нужно.2. «Я хочу знать, как мне продолжать ждать внутри контроллера, пока значение атрибута json ответа не будет установлено в ‘Registered'» — вы просто не должны (ожидание чего-то, что занимает от минут до часов в контроллере, является плохой идеей)… но поскольку это не тот ответ, который вы ищете, я не публикую его как ответ
3. Почему вам нужно ждать ответа?
4. У меня есть еще один запрос API для завершения после вышеупомянутого запроса. Следующий запрос API, требуемый выше одного значения, должен быть «Зарегистрирован». Вот почему мне нужно этого дождаться. Весь этот процесс можно выполнить с помощью Azure power-shell. Он также ожидает это количество времени.
5. Я знаю, что это не очень хорошая практика. Но требование таково. @Ryan могу ли я использовать цикл while здесь?
Ответ №1:
HttpClient
имеет свойство с именем, Timeout
для которого по умолчанию установлено значение 100
секунды, используйте это:
client.Timeout = TimeSpan.FromMinutes(4);
Комментарии:
1. время ожидания не истекло. код ответа в порядке, когда его значение изменяется на регистрацию.
Ответ №2:
Как упоминалось в комментариях выше, так долго ждать в вашем контроллере — плохая идея. Но, поскольку требуется ждать так долго, я предоставлю логику для реализации этого:
HttpClient client = new HttpClient();
HttpRequestMessage request2 = new HttpRequestMessage(HttpMethod.Post, String.Format(Constants.MicrosoftManagedProviderRegisterApi, subscription));
request2.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response2 = null;
while (!IsRegistered(response2))
{
response2 = await client.SendAsync(request2).ConfigureAwait(false);
}
Зарегистрирована ли логика метода (добавьте больше проверок):
private Task<bool> IsRegistered(HttpResponseMessage response)
{
if (response != null)
{
var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
if (!string.IsNullOrWhiteSpace(result))
{
serviceResponse = this.serializer.Deserialize<ServiceResponseSchema>(result);
if (string.Compare(serviceResponse.RegistrationState, "Registered") == 0)
{
return true;
}
}
}
return false;
}
Я понимаю, что вы нажимаете на URL, пока не получите желаемый ответ. Пожалуйста, дайте мне знать, если я неправильно понимаю.
Комментарии:
1. .EnsureSuccessStatusCode() устанавливается в значение true, как только он находится в статусе «Регистрация». Мне нужно продолжать ждать, пока его значение атрибута json ответа ‘Зарегистрировано’. Я обновлю значения ответа в моей вышеуказанной области вопросов
2. это предварительно настроенный метод из ‘System.Net.Http.Headers’, верно? Как я должен изменить его, чтобы возвращать значение true при статусе «Зарегистрирован»? Пожалуйста, посоветуйте мне по этому поводу
3. Я обновил свой ответ, пожалуйста, проверьте. Я думал, что у вас есть этот метод как ваш собственный.
4. Создайте новое действие для проверки состояния и возврата его, вызовите этот API в цикле из клиента. Запуск цикла в браузере, где у вас нет такой же проблемы с таймаутом. В противном случае я бы предложил веб-сокет или события, отправленные сервером.
5. Большое вам спасибо. Я попробую это