Android,Xamarin Forms PCL,PortableRest PCL和Async Web Api Call

Wic*_*edW 4 android async-await xamarin xamarin.forms

我正在尝试使用PortableRest从Xamarin Forms对Web API 2.2 Rest服务进行异步调用.

我想我有某种死锁/同步上下文问题,但我无法解决(asbie等新手).

有人可以帮忙吗?

我的控制器测试方法(删除了对数据库的任何调用) -

public IEnumerable<ContentModel> GetTestRest()
{
    return new List<ContentModel> {
        new ContentModel() {Categoryid = 1, Title = "Title"}};
}
Run Code Online (Sandbox Code Playgroud)

我的单元测试通行证 -

[TestMethod]
public async Task TestRest()
{
    MyNewsApiClient MyNewsApiClient = new MyNewsApiClient();

    var models = await MyNewsApiClient.TestRest();
    int count = models.Count;
    Assert.AreEqual(1, count);
}
Run Code Online (Sandbox Code Playgroud)

我的PortableRest Proxy(PCL)方法 -

public async Task<List<ContentModel>> TestRest()
{
    var request = new RestRequest();
    request.Resource = "Content/GetTestRest";

    return await ExecuteAsync<List<ContentModel>>(request);
}
Run Code Online (Sandbox Code Playgroud)

Xamarin Forms 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

等待api.TestRest()永远不会导致设置HeaderLabel.After或ListView.

如果我只是添加一个测试代理方法GetDelay(),它不通过return await ExecuteAsync>(request)调用PortableRest ;

public async Task<bool> GetDelay ()
{
    await Task.Delay (1000);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

然后所有"工作".

感谢您的帮助,如果需要,我将下载PortableRest的源代码(目前使用Nuget dll),只是不确定是否遗漏了这个顶级的基本内容.

Wic*_*edW 8

对,这最终与Async(或任何PortableRest问题)无关,但我想如果它可以帮助其他人,我会分享.

我最终放了一个try块(现在显而易见的下一步!)并抓住了这个例外 -

找不到方法:'System.Net.Http.HttpClientHandler.set_AutomaticDecompression'.

所以,看着这个 -

http://davidburela.wordpress.com/2013/07/12/error-when-using-http-portable-class-library-compression/

PortableRest已经在我的Forms PCL中,但我需要将Microsoft Http Client Libraries Nuget添加到我的Android应用程序中.

然后我得到了 -

错误:ConnectFailure(请求的地址在此上下文中无效)

我认为它可能与Android权限有关,但它不是在这种情况下(虽然我现在意识到我需要为未来的通话添加Internet权限).

因为我正在我的应用程序在虚拟机(从GenyMotion /虚拟盒),那么Android应用程序不能访问本地主机(在我的网页API驻留)

所以,从这个 -

http://bbowden.tumblr.com/post/58650831283/accessing-a-localhost-server-from-the-genymotion

我可以确认使用VirtualBox>文件>首选项>网络> VirtualBox主机网络适配器>修改中显示的地址可以很好地完成工作.

谢谢你的帮助.