如何保持等待API请求响应值完成的ASP .Net Core MVC

问题描述

我有使用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,直到获得所需的响应为止。请让我知道我的理解是否错误。