HttpPostAsync 不返回任何结果但正确插入实体

HttpPostAsync not returning any result but inserting entity correctly

我有一个通用的 PostAsync 方法,然后我有我的 AddCart 方法在我的 api 上插入我的 CrCart 实体。问题是,我想要 return 结果,但它会停止而不是 return 任何东西,即使它正确地插入 api。

这是我的PostAsync方法

 // Generic Post Method
        public async Task<T> HttpPostAsync<T>(string url, string token, T data)
        {
            T result = default(T); // résultat de type générique

            try
            {
                string json = JsonConvert.SerializeObject(data);
                StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                var response = await httpClient.PostAsync(new Uri(url), content);

                if (response.IsSuccessStatusCode)
                {
                    var jsonResponse = await response.Content.ReadAsStringAsync();
                    result = JsonConvert.DeserializeObject<T>(jsonResponse);
                }
                else
                {
                    throw new Exception(((int)response.StatusCode).ToString() + " - " + response.ReasonPhrase);
                }
                return result;
            }
            catch (Exception ex)
            {
                OnError(ex.ToString());
                return result;
            }
        }

这是我的AddCart方法

public async Task<CrCart> AddCart(string url, string token, CrCart data)
        {

            var cart = await _apiService.HttpPostAsync(url, token, data);

            return cart;

        }

这里就是我打电话的地方AddCart。叫法一样。

        private async void AddCart()
        {
            if (CurrentPropertiesService.GetCart() == "" )
            {
                _oCart = new CrCart()
                {
                    IdCustomer = Convert.ToInt32(CurrentPropertiesService.GetCustomer()),
                    IdUser = Convert.ToInt32(CurrentPropertiesService.GetUserId()),
                    Date = DateTime.UtcNow,
                    Status = "Saved"
                };

                var cart = await _apiService.AddCart(Constants.UrlCart, CurrentPropertiesService.GetToken(), _oCart);
                CurrentPropertiesService.SaveCart(cart);
            }
            else
            {
                _oCart.Id = Convert.ToInt32(CurrentPropertiesService.GetCart());
            }

        }

然后我在构造函数上调用该方法。这就是所有的调用堆栈。

public ProductDetailPage(CrProduct oProduct, int category)
        {
            InitializeComponent();
            _oProduct = oProduct;

            ProductImage.Source = _oProduct.Image;
            txtName.Text = _oProduct.Name;
            txtDescription.Text = _oProduct.Description;
            txtDetails.Text = _oProduct.Stock.ToString();
            txtPrice.Text = string.Format("{0:N2}€", _oProduct.Price.ToString());
            AddCart();
        }

当我尝试调试时,它停止了,就像我在这一行中所说的那样,正确插入并且没有给出任何错误,但没有 return 响应。

var response = await httpClient.PostAsync(new Uri(url), content);

我尝试在 OnAppearing() 方法而不是构造函数上调用它,并使其异步以查看是否有任何不同,但也不起作用。

请帮忙,因为我不知道这里的问题是什么。谢谢。

正如第一条评论中所建议的,这可能是一个死锁。

这个简单的修复可能会满足您的需要:

public ProductDetailPage(CrProduct oProduct, int category)
{
    ...
    // Create an "async" context on MainThread. Code inside runs AFTER constructor returns.
    // Can also use the equivalent Xamarin.Essentials.MainThread.BeginInvokeOnMainThread.
    Xamarin.Forms.Device.BeginInvokeOnMainThread(async () =>
    {
        await AddCart();
    }
}

注意:我故意不使用较新的 MainThread.InvokeOnMainThreadAsync,因为构造函数不是 async 方法。

后果:由于此代码运行稍晚,页面可能首先出现而没有任何购物车内容。如果是这样,那么避免这种情况需要在其他地方更改代码 - 调用构造函数的地方。但首先,看看以上是否有效。

根据您的描述,await 方法 var response = await httpClient.PostAsync(new Uri(url), content); post 实体正确,但 response 为空。

所以原因可能是该方法是一个异步方法,程序进入下一行 if (response.IsSuccessStatusCode)而不等待await httpClient.PostAsync(new Uri(url), content);的结果。

您可以尝试使用以下代码让程序等待PostAsync:

var response = httpClient.PostAsync(new Uri(url), content).Wait
or
var response = httpClient.PostAsync(new Uri(url), content).Result