PortableRest을 사용하여 Xamarin Forms에서 Web API 2.2 Rest 서비스를 비동기 호출하려고합니다.안드로이드, Xamarin 양식 PCL, PortableRest PCL 및 비동기 웹 API 호출
필자는 교착 상태/synchronisationcontext 문제가 있다고 생각하지만 비동기 (newbie to async 등)을 해결할 수는 없습니다.
아무도 도와 줄 수 있습니까?
내 컨트롤러 시험 방법 (제거 데이터베이스에 대한 모든 호출) -
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 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;
}
}
api.TestRest()는 HeaderLabel.After 또는 ListView가 설정되지 않습니다.
을 통해 PortableRest를 호출하지 않는 테스트 프록시 메서드 GetDelay()를 추가하는 경우 ExecuteAsync> (요청);
public async Task<bool> GetDelay()
{
await Task.Delay (1000);
return true;
}
그러면 모두 "작동합니다".
도와 주셔서 감사합니다. 필요한 경우 (현재 Nuget dll을 사용하여) PortableRest의 소스 코드를 다운로드하고,이 최상위 레벨에서 기본 무언가가 누락되었는지 확실하지 않습니다.
acutal 네트워크 트래픽을 확인 했습니까? 연결하는 동안 오류가 발생할 수 있습니다. HttpClient.GetAsync <>를 사용하여 연결 문제를 해결할 수도 있습니다 –
감사합니다 @StenPetrov, 트래픽을 확인했는데 바깥 쪽 전화가 맞지 않습니다. 이제는 try 블록에서 호출을 포위하고 더 멀리보고 있습니다. – WickedW