如何继续等待 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"
【问题讨论】:
读取响应消息,如果不等于“已注册”则再次调用。带有loop
的 if
语句和在下次调用 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 响应