我有一個通用PostAsync方法,然后我有我的AddCart方法在我的 api 上插入我的CrCart物體。問題是,我想回傳結果,但即使它正確插入 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)
{
one rror(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();
}
當我嘗試除錯時,它會停止,正如我在這一行中所說的那樣,正確插入并且不給出任何錯誤但不回傳回應。
var response = await httpClient.PostAsync(new Uri(url), content);
我嘗試在 OnAppearing() 方法而不是建構式上呼叫它,并使其異步以查看是否有任何區別,但也不起作用。
請幫忙,因為我不知道這里有什么問題。謝謝。
uj5u.com熱心網友回復:
正如第一條評論中所建議的,這可能是一個僵局。
這個簡單的修復可能會滿足您的需要:
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();
}
}
注意:我故意不使用 newer MainThread.InvokeOnMainThreadAsync,因為建構式不是async方法。
暗示:由于此代碼運行稍晚一些,因此頁面可能首先出現時沒有任何購物車內容。如果是這樣,那么避免這種情況需要在其他地方更改代碼 - 呼叫建構式的地方。但首先,看看上述是否有效。
uj5u.com熱心網友回復:
根據您的描述,await 方法var response = await httpClient.PostAsync(new Uri(url), content);正確發布了物體,但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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/472218.html
下一篇:API的Laravel分頁
