gpt4 book ai didi

Android、Xamarin Forms PCL、PortableRest PCL 和异步 Web Api 调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:07 27 4
gpt4 key购买 nike

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

我想我遇到了某种死锁/同步上下文问题,但我无法解决(新手到异步等)。

有人可以帮忙吗?

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

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 代理 (PCL) 方法 -

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

return await ExecuteAsync<List<ContentModel>>(request);
}

Xamarin 表单内容页面 (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;
}
}

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

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

调用 PortableRest
public async Task<bool> GetDelay ()
{
await Task.Delay (1000);
return true;
}

然后所有“工作”。

感谢您的帮助,如果需要我会下载 PortableRest 的源代码(目前使用 Nuget dll),只是不确定是否缺少此顶层的基本内容。

最佳答案

是的,这最终与 Async(或 PortableRest 的任何问题)无关,但我想我会分享以防它可以帮助其他人。

我最终放置了一个try block (现在显然是下一步!)并捕获了这个异常 -

未找到方法:“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/Virtual Box)中运行我的应用程序,所以 Android 应用程序无法访问 LocalHost(我的 Web Api 所在的位置)

所以,从这个——

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

我可以确认使用 VirtualBox > File > Preferences > Network > VirtualBox Host-Only Network Adapter > Modify 中显示的地址可以很好地完成工作。

感谢您的帮助。

关于Android、Xamarin Forms PCL、PortableRest PCL 和异步 Web Api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com