HttpReponseMessage有StatusCode 200但是'结果'是空的

时间:2017-07-18 13:30:29

标签: c# asp.net async-await bigcommerce

我目前正在开发一个与Web API集成的应用程序。我有一个异步函数,它向Web API发送PUT请求以更新产品。

    public async Task<ResponseStatus> updateProduct(Item product)
    {
        string URL = client.BaseAddress + "/catalog/products/" + product.id;
        HttpResponseMessage response = await client.PutAsJsonAsync(URL, product).ConfigureAwait(false);
        var payload = response.Content.ReadAsStringAsync();
        ResponseStatus res = JsonConvert.DeserializeObject<ResponseStatus>(await payload.ConfigureAwait(false));

        return res;
    }

在我用来测试我的应用程序的控制台应用程序中,此功能完全按预期工作,我在响应的Result中收到更新的产品作为JSON字符串。

enter image description here

但是当我尝试从ASP.Net应用程序调用此函数时,我在Result中收到一个空字符串,即使它的状态代码为200.我也可以看到我的更新没有对产品起作用,即使它在控制台应用程序中调用时肯定会更新。

enter image description here

我有一些Web API调用,例如此GET请求,它的工作方式几乎完全相同,但这在ASP.Net应用程序和测试控制台应用程序中有效。

    public async Task<Product> getProductByID(int id)
    {
        Product product = null;
        string URL = client.BaseAddress + "/catalog/products/" + id;
        string additionalQuery = "include=images,variants";
        HttpResponseMessage response = await client.GetAsync(URL + "?" + additionalQuery).ConfigureAwait(false);
        if (response.IsSuccessStatusCode)
        {
            var payload = response.Content.ReadAsStringAsync();
            product = JsonConvert.DeserializeObject<Product>(await payload.ConfigureAwait(false));
        }
        return product;
    }

为什么在ASP.Net应用程序中,即使Result为空并且实际上没有对产品进行更新,我也会收到成功状态代码?

2 个答案:

答案 0 :(得分:1)

您需要await payload Task没有ConfigureAwait(false)

使用ConfigureAwait(false)时,如果Task返回Result,则无法保证保留ASP.NET响应上下文。这是ASP.NET运行时的特性。

它被称为Best Practice tip for async/await by Microsoft

  

在需要上下文的方法中的await之后有代码时,不应该使用ConfigureAwait。对于GUI应用程序,这包括操作GUI元素,写入数据绑定属性或依赖于特定于GUI的类型(如Dispatcher / CoreDispatcher)的任何代码。 对于ASP.NET应用程序,这包括使用HttpContext.Current或构建ASP.NET响应的任何代码,包括控制器操作中的return语句。

答案 1 :(得分:1)

对于遇到此事的人。我试图通过BigCommerce API更新产品,我的代码中出现错误,产品的custom_url对象将其网址设置为null

enter image description here

这显然在BigCommerce API服务器上产生了错误,但是在返回Success Code 200时无法正确处理,即使产品没有得到更新。这产生了我得到的空洞反应。