如何继续等待 API 请求响应值完成 ASP .Net Core MVC

Posted

技术标签:

【中文标题】如何继续等待 API 请求响应值完成 ASP .Net Core MVC【英文标题】:How to keep waiting for API request response value complete 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 循环吗? 【参考方案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 套接字或服务器发送的事件。 非常感谢。我会试试这个

以上是关于如何继续等待 API 请求响应值完成 ASP .Net Core MVC的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET Web API 中立即返回 HTTP 响应

如何使用事件发射器调用返回值的函数,并在继续之前等待响应?

如何在继续之前等待 requestLocation?

ios - 如何使用 Alamofire 等待 api 响应

Ajax+PHP打造等待进度条效果

网络请求返回码说明