2014-07-17 3 views
4

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의 소스 코드를 다운로드하고,이 최상위 레벨에서 기본 무언가가 누락되었는지 확실하지 않습니다.

+0

acutal 네트워크 트래픽을 확인 했습니까? 연결하는 동안 오류가 발생할 수 있습니다. HttpClient.GetAsync <>를 사용하여 연결 문제를 해결할 수도 있습니다 –

+0

감사합니다 @StenPetrov, 트래픽을 확인했는데 바깥 쪽 전화가 맞지 않습니다. 이제는 try 블록에서 호출을 포위하고 더 멀리보고 있습니다. – WickedW

답변

8

그렇습니다. 결국 비동기 (또는 PortableRest와 관련된 문제)와는 아무런 관련이 없지만 다른 사람들에게 도움이 될 수 있도록 공유 할 것이라고 생각했습니다. (! 명백한 다음 단계는 지금)

나는 결국 try 블록을 넣어이 예외 잡은 - 발견되지

방법 : 'System.Net.Http.HttpClientHandler.set_AutomaticDecompression를'.

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

PortableRest 내 양식 PCL에 이미,하지만 난 내 안드로이드 응용 프로그램에 마이크로 소프트의 HTTP 클라이언트 라이브러리 Nuget를 추가 할 필요 -

그래서,이를 찾고 있습니다.

그때 있어요 -

오류 : ConnectFailure는

내가 안드로이드 권한 함께 할 수있는 뭔가가있을 수 있습니다 생각했지만이 아니었다 (요청 된 주소는이 상황에서 유효하지 않습니다) 케이스 (비록 지금 나는 미래의 호출을 위해 어쨌든 인터넷 허가를 추가 할 필요가 있음을 알지만).

나는이에서,

그래서 VM 내 응용 프로그램 (GenyMotion에서/가상 상자)를 안드로이드 앱 로컬 호스트에 액세스 할 수 없습니다 (내 웹 API가있는)를 실행하고 있기 때문에 -

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

VirtualBox> 파일> 환경 설정> 네트워크> VirtualBox 호스트 전용 네트워크 어댑터> 수정에 표시된 주소를 사용하면 작업이 훌륭하게 수행되는지 확인할 수 있습니다.

도움 주셔서 감사합니다.

관련 문제