【发布时间】:2021-02-19 15:20:44
【问题描述】:
我正在实现一个 MVC 项目,它在后端调用不同的 Boomi Atomsphere API。
其中一个由两个异步调用组成。 第一个要求令牌 第二个使用令牌获取数据。 我正在使用 RestClient 来做到这一点。奇怪的是,在调试模式下它可以工作并获取所有值。 当我正常运行项目时,我没有得到任何价值。
这是一个代码示例:
private async Task<ListenerDetails> getListenersForEnv(string atomID) {
var client = getClient();
var token = await getTokenListeners(atomID);
string resourceListenerRecord = "/async/ListenerStatus/response/"+ token;
var listenerRequestRecord = getRequest(resourceListenerRecord);
var responselistenerRecord = await client.ExecuteAsync(listenerRequestRecord);
var jsonoObjListenerRecord = JObject.Parse(responselistenerRecord.Content);
ListenerDetails model = new ListenerDetails();
model.listenerModel = mapper.Map<ListenerDetails>(jsonoObjListenerRecord).listenerModel;
model.numberOfResults = mapper.Map<ListenerDetails>(jsonoObjListenerRecord).numberOfResults;
var apiListenerResponse = !string.IsNullOrWhiteSpace(responselistenerRecord.Content) ? model : null;
var apiListenerResponseDocument = responselistenerRecord.StatusCode == HttpStatusCode.OK && apiListenerResponse != null ? apiListenerResponse : null;
return apiListenerResponseDocument;
}
private async Task<string> getTokenListeners( string atomID) {
var client = getClient();
string resourceTokenListenerRecord = "/async/ListenerStatus/query";
string requestTokenListenerRecord = "{\"QueryFilter\" : {\"expression\" :{\"argument\" : [\""+ atomID + "\"],\"operator\" : \"EQUALS\",\"property\":\"containerId\"}}}";
var listenerrequestRecord = getRequest(resourceTokenListenerRecord, requestTokenListenerRecord);
var responseexecutionRecord = client.ExecuteAsync(listenerrequestRecord).Result;
var jsonoObjexecutionRecord = JObject.Parse(responseexecutionRecord.Content);
var modelDetail = mapper.Map<ListenerAsyncOperationTokenResultModel>(jsonoObjexecutionRecord).asyncToken;
var apiResponseDocuments = !string.IsNullOrWhiteSpace(responseexecutionRecord.Content) ? modelDetail : null;
var apiResponseDocument = responseexecutionRecord.StatusCode == HttpStatusCode.Accepted && apiResponseDocuments != null ? apiResponseDocuments : null;
return Task.FromResult(apiResponseDocument.token).Result;
}
private RestRequest getRequest(string resource, string requestData) {
var request = new RestRequest(resource, Method.POST, DataFormat.Json);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddJsonBody(requestData);
return request;
}
private RestRequest getRequest(string resource)
{
var request = new RestRequest(resource, Method.GET);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept", "application/json");
return request;
}
谁能告诉我为什么它只能在调试模式下工作?
【问题讨论】:
-
您可能没有在某处使用
await吗?在调试中,当您单步执行代码时,它可能会在返回任务之前完成一些操作,而是返回结果? -
您好 user3953989,感谢您回来。在示例代码中,我刚刚在 await getTokenListeners(atomID); 上使用了 await并等待 client.ExecuteAsync(listenerRequestRecord);所以只是等待获取令牌操作然后等待响应以获取所有数据。不知道在这个示例代码中我还能把 await 放在哪里。第一次调用 getTokenListeners 工作正常。谢谢。
-
我的疑问是:因为我已经在执行异步 API 调用 "/async/ListenerStatus/response/"+ token;是否有必要调用'await client.ExecuteAsync(listenerRequestRecord);'?也许应该是 client.ExecuteExecuteAsync(listenerRequestRecord);即使 API 是异步的,也要运行同步调用?即使此异步调用未终止,流程可能仍在继续?谢谢
标签: c# visual-studio async-await visual-studio-debugging