【问题标题】:How to keep waiting for API request response value complete ASP .Net Core MVC如何继续等待 API 请求响应值完成 ASP .Net Core MVC
【发布时间】:2020-12-29 08:32:01
【问题描述】:

我有一个使用 Azure 服务管理 API 的带有多个外部 api 请求的 asp .net core mvc 应用程序。 https://docs.microsoft.com/en-us/rest/api/resources/providers/register#code-try-0 从此 api 请求注册任何命名空间。但它有更多的时间来完成。最初,它的响应 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 属性值设置为“已注册”。有什么简单的方法可以实现吗?

请参考下面的回复类型。

{
  "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"
}

【问题讨论】:

  • 读取响应消息,如果不等于“已注册”则再次调用。带有 loopif 语句和在下次调用 api 之前稍等片刻以防止节流,听起来就像你所需要的。
  • "我想知道我应该如何一直在控制器内部等待,直到响应 json 属性值设置为 'Registered'" - 你根本不应该(在控制器中等待几分钟到几小时的事情是一个坏主意)...但是由于它不是您正在寻找的答案,因此我不会将其作为答案发布
  • 为什么要等待答案?
  • 在上述请求之后,我还有另一个 API 请求要完成。需要高于一个值的下一个 API 请求应“已注册”。这就是为什么我需要等待。整个过程可以使用 Azure power-shell 完成。它也在等待那段时间。
  • 我知道这不是好的做法。但要求就是这样。 @Ryan 我可以在这里使用 while 循环吗?

标签: c# asp.net-mvc azure asp.net-core


【解决方案1】:

HttpClient 有一个名为Timeout 的属性,默认设置为100 秒,使用这个:

client.Timeout = TimeSpan.FromMinutes(4);

【讨论】:

  • 它没有超时。响应码在其值更改为注册时是可以的。
【解决方案2】:

正如上面的 cmets 所述,在控制器中等待这么长时间是个坏主意。但是,由于要求是等待那么长时间,我将提供一个实现此的逻辑:

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);
            }

IsRegistered 方法逻辑(添加更多检查):

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,直到获得所需的响应。如果我的理解有误,请告诉我。

【讨论】:

  • .EnsureSuccessStatusCode() 在“注册”状态下设置为 true。我需要一直等到它的响应 json 属性值“已注册”。我将更新上述问题区域中的响应值
  • 它是来自'System.Net.Http.Headers'的预配置方法,对吗?当“已注册”状态时,我应该如何将其更改为返回 true?请给我建议
  • 我已经更新了我的答案,请检查。我以为你有自己的方法。
  • 创建一个新动作来检查状态并返回它,从客户端循环调用该 API。将循环推送到浏览器,在那里您没有相同的超时问题。否则,我建议使用 Web 套接字或服务器发送的事件。
  • 非常感谢。我会试试这个
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多