我在Azure中托管了一个ASP.NET WebApi。它没有基于HTTP头的或Azure API身份验证,fiddler会话证明API功能齐全,并按要求和期望吐出数据。
在我的Xamarin表单(PCL,iOS和Android)PCL项目中,我在服务类中有以下代码:
public async Task<IEnumerable<Link>> GetCategories()
{
IEnumerable<Link> categoryLinks = null;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//Using https to satisfy iOS ATS requirements
var response = await client.GetAsync(new Uri("https://myproject.azurewebsites.net/api/contents"));
//response.EnsureSuccessStatusCode(); //I was playing around with this to see if it makes any difference
if (response.IsSuccessStatusCode)
{
var content = response.Content.ReadAsStringAsync().Result;
categoryLinks = JsonConvert.DeserializeObject<IEnumerable<Link>>(content);
}
}
return categoryLinks;
}
我调试了代码并注意到控件没有通过:
var response = await client.GetAsync(new Uri("https://myproject.azurewebsites.net/api/contents"));
因此categoryLinks保持为空。
以前有人遇到过这个吗?
有几点需要注意:
虽然我怀疑这里是否有任何问题,但我有一个MainViewModel类,如下所示:
public class MainViewModel
{
private readonly INavigation navigation;
private readonly IContentService contentService;
public IEnumerable<CategoryItem> Categories { get; set; }
public MainViewModel(IContentService contentservice, INavigation nav)
{
this.navigation = nav;
this.contentService = contentservice;
SetCategoriesAsync();
}
private async Task SetCategoriesAsync()
{
var response = await this.contentService.GetCategories();
this.Categories = (from c in response
select new CategoryItem()
{
//code removed but you get the idea
}).AsEnumerable();
}
}
我的MainPage.xaml.cs在构造函数中有以下几行。我认为这里也没有任何问题。
this.MainViewModel = new MainViewModel(contentService, navService);
this.CategoriesList.ItemsSource = this.MainViewModel.Categories;
根据this link,我已经按照外观的顺序通过nuget将引用添加到以下库:Microsoft.BCL,Microsoft.BCL.Build,Microsoft.Net.Http
我还没有使用ModernHttpClient。一旦我有HttpClient工作,我打算这样做,因为我相信它可以提高性能。
对此的任何帮助将不胜感激。
答案 0 :(得分:1)
我遇到了这个确切的问题,它是由死锁引起的,你怎么称呼这个方法?通常我会去:
Device.BeginInvokeInMainThread(async () =>
{
var categoriesList = await GetCategories();
});
或者如果它在您的视图模型中,您可以使用Task.Run();
避免使用.Result和UI中的计时器,甚至事件处理程序也可能导致像这样的死锁。
希望这会有所帮助。