【问题标题】:API call with RestClient works only in Debug in VisualStudio使用 RestClient 的 API 调用仅适用于 Visual Studio 中的调试
【发布时间】: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


【解决方案1】:

我猜你在某处错过了等待。快速查看您的代码后,有一个返回 vvariabe 'responseexecutionRecord',它调用函数 getTokenListeners 中的方法 client.ExecuteAsync,可以在它执行异步方法时等待。您可以删除 .result 并等待它。

【讨论】:

  • 您好 Ajinkya,感谢您的提示。我试过了,但行为还是一样。仅当我设置断点并手动前进时,它仍然有效。似乎 await 不处理异步方法。
【解决方案2】:

我也试过: Example Code

但检索仍然为空 Result

【讨论】:

  • 您收到 202 响应意味着该进程仍在处理中。应该更改 Task 的写入位置,只需 await 即可获取数据。您愿意分享我可以在本地运行的代码块吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2018-12-25
  • 2021-09-28
  • 1970-01-01
  • 2019-09-17
  • 2015-10-05
  • 2018-04-20
相关资源
最近更新 更多