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
我有一个通用的 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