问题描述
我有使用Azure服务管理API的带有多个外部api请求的asp .net核心mvc应用程序。来自此api请求的https://docs.microsoft.com/en-us/rest/api/resources/providers/register#code-try-0注册任何名称空间。但是它有更多的时间来完成。最初,它的响应json属性值是“未注册”,在上述POST请求之后,将其值设置为“正在注册”。它需要2到3分钟才能完成。最后将响应值设置为“已注册”。
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","registrationState": "Registering","registrationState": "Registered","registrationPolicy": "Registrationrequired"
}
解决方法
HttpClient
具有一个名为Timeout
的属性,默认情况下设置为100
秒,请使用以下方法:
client.Timeout = TimeSpan.FromMinutes(4);
如上面的评论中所述,在控制器中等待这么长时间是一个坏主意。但是,由于要求等待这么长时间,因此我将提供实现此目的的逻辑:
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,直到获得所需的响应为止。请让我知道我的理解是否错误。