c# API调用无响应结束。结果语句

问题描述 投票:0回答:1

下面是我们用来进行 API 调用的通用类。我有几个调用需要下面的语句

var notSureWhyWeNeedThisButWeDo = response.Result;
才能使其工作,而其他调用则根本不需要它。有人可以解释为什么需要这个并且必须有更好的方法来编码吗?

public class APICallClass
{
    private static HttpClient client = new HttpClient();

    public static async Task<HttpResponseMessage> APICall(AccessTokenObject root, string json, string paCode, string url, string type)
    {
        try {
            var data = new StringContent(json, Encoding.UTF8, "application/json");
            data.Headers.Add("securityToken", root.access_token);
            if (paCode.Length > 0) {
                data.Headers.Add("X-POS-MerchantID", paCode);
            }

            Task<HttpResponseMessage> response;

            switch (type) {
                case "put":
                    response = client.PutAsync(url, data);
                    break;
                case "post":
                    response = client.PostAsync(url, data);
                    break;
                default:
                    response = client.PostAsync(url, data);
                    break;
            }

            var notSureWhyWeNeedThisButWeDo = response.Result;

            return await response.ConfigureAwait(false);

        } catch (Exception ex) {
            Logging.WriteErrorMessage(Priority.High, string.Empty, "APICall",  "APICall.cs",url, ex, "client.xxxxAsync", false);
            return null;
        }
    }
}

我正在用这样的语句来调用这个:

var response = await TalechAPI.APICall(root, json, pa.storeId, "https://mapi.talech.com/managemenu/menuitem/allmenuitems", "post");

通话结束后,我们会做这样的事情:

using (HttpContent content = response.Content)
{
    var result = await response.Content.ReadAsStringAsync();
    AddMenuItem.AddMenuItemRoot hd = JToken.Parse(result).ToObject<AddMenuItem.AddMenuItemRoot>();

    if ((int) response.StatusCode != 200) {
        Logging.WriteErrorMessage(Priority.High, string.Empty, "Talech", "Items.cs", "RootInsertItem", response.StatusCode.ToString(), "TalechBatchUser", false);
        return null;
    }
c# dotnet-httpclient
1个回答
0
投票

在您的示例中,我认为您正在获取等待程序并配置它,但这不会等待执行(您等待配置等待响应)。 您为读取结果而进行的调用会强制调用同步,因为结果在完成后才可用。

switch (type) {
  case "put":
    return await client.PutAsync(url, data);                   
  case "post":
    return await client.PostAsync(url, data);
  default:
    return await client.PostAsync(url, data);
}

这就是完成后返回响应所需的全部内容。

© www.soinside.com 2019 - 2024. All rights reserved.