我正在尝试使用PortableRest从Xamarin Forms对Web API 2.2 Rest服务进行异步调用。
我认为我遇到了某种死锁/同步问题,但我无法解决这个问题(asbie等新手)。
有人可以帮忙吗?
我的控制器测试方法(删除了对数据库的任何调用) -
public IEnumerable<ContentModel> GetTestRest()
{
return new List<ContentModel> {
new ContentModel() {Categoryid = 1, Title = "Title"}};
}
我的单元测试通行证 -
[TestMethod]
public async Task TestRest()
{
MyNewsApiClient MyNewsApiClient = new MyNewsApiClient();
var models = await MyNewsApiClient.TestRest();
int count = models.Count;
Assert.AreEqual(1, count);
}
我的PortableRest Proxy(PCL)方法 -
public async Task<List<ContentModel>> TestRest()
{
var request = new RestRequest();
request.Resource = "Content/GetTestRest";
return await ExecuteAsync<List<ContentModel>>(request);
}
Xamarin表单ContentPage(PCL) -
public partial class NewsType1CP : ContentPage
{
public NewsType1CP ()
{
InitializeComponent ();
}
protected override void OnAppearing ()
{
LoadData (); // this is a sync call of an async method, not sure how else to approach, make OnAppearing async?
}
public async Task LoadData ()
{
Debug.WriteLine ("LoadData");
HeaderLabel.Text = "Load Data!";
MyNewsApiClient api = new MyNewsApiClient ();
var cm = await api.TestRest ();
// this will work on its own, control returns to this method - await api.GetDelay ();
HeaderLabel.Text = "After! - ";
NewsListView.ItemsSource = cm;
}
}
await to api.TestRest()永远不会导致设置HeaderLabel.After或ListView。
如果我只是添加一个测试代理方法GetDelay(),它不会通过返回等待ExecuteAsync&gt;(请求);
来调用PortableRestpublic async Task<bool> GetDelay ()
{
await Task.Delay (1000);
return true;
}
然后所有“工作”。
感谢您的帮助,如果需要,我会下载PortableRest的源代码(目前使用Nuget dll),只是不确定是否遗漏了这个顶级的基本内容。
答案 0 :(得分:8)
是的,这最终与Async(或任何PortableRest问题)无关,但我认为我会分享,以防它可以帮助其他人。
我最终放了一个 try block (现在明显是下一步!)并抓住了这个异常 -
找不到方法:&#39; System.Net.Http.HttpClientHandler.set_AutomaticDecompression&#39;。
所以,看看这个 -
PortableRest已经在我的Forms PCL中,但我需要将Microsoft Http Client Libraries Nuget添加到我的Android应用程序中。
然后我得到了 -错误:ConnectFailure(请求的地址在此上下文中无效)
我认为它可能与Android权限有关,但在这种情况下并不是这样(尽管我现在意识到我需要为未来的通话添加Internet权限)。
因为我在VM中运行我的应用程序(来自GenyMotion / Virtual Box),所以Android应用程序无法访问LocalHost(我的Web Api所在的地方)
所以,从这个 -
http://bbowden.tumblr.com/post/58650831283/accessing-a-localhost-server-from-the-genymotion
我可以确认使用VirtualBox&gt;中显示的地址文件&gt;偏好&gt;网络&gt; 感谢您的帮助。