2017-06-06 2 views
2

J'essaie de développer une application native Xamarin.Forms ou Xamarin.iOS/Xamarin.Droid qui peut faire un appel API Web à mon serveur. J'obtiens l'erreur en disant HttpRequestException jeté. Une fois que j'ai cherché une solution, elle dit que c'est parce qu'elle ne peut pas atteindre le socket, mais je suis incapable de l'installer dans un projet PCL. Donc, je vérifie la solution pour cela et ils ont dit d'utiliser un proxy pour atteindre le service.Appel WebAPI Xamarin de PCL

Voici mon problème. J'ai essayé de faire un proxy dans le PCL pour me connecter à un service dans les projets .Droid ou .iOS afin qu'ils puissent utiliser les sockets, (bien que je ne pense pas que le service devrait être dans le projet d'application lui-même). Mais la classe proxy n'est pas capable de référencer le service car il ne fait pas partie du projet. Il s'agit de la classe RestService.

public class RestService : IRestService 
{ 
    private const string BASE_URI = "http://xxx.xxx.xxx.xxx/"; 
    private HttpClient Client; 
    private string Controller; 

    /** 
    * Controller is the middle route, for example user or account etc. 
    */ 
    public RestService(string controller) 
    { 
     Controller = controller; 
     Client = new HttpClient(); 
    } 

    /** 
    * uri in this case is "userId?id=1". 
    */ 
    public async Task<string> GET(string uri) 
    { 
     try 
     { 
      Client.BaseAddress = new Uri(BASE_URI); 
      Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      var fullUri = String.Format("api/{0}/{1}", Controller, uri); 
      var response = Client.GetAsync(fullUri); 
      string content = await response.Result.Content.ReadAsStringAsync(); 
      return content; 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 
} 

Je ne peux pas trouver de bons tutoriels en ligne sur la façon d'obtenir ce travail et toute aide dans ce qui concerne serait très apprécié.

+0

Avez-vous vérifié this- https://stackoverflow.com/questions/15143107/httpclient-httprequestexception et this- https://stackoverflow.com/questions/31131658/xamarain-web-api –

+0

a juste pris un Regardez les deux liens. Les deux solutions ne sont pas le problème ici car je n'utilise pas IIS et l'url donné fonctionne avec un facteur. – Tomaltach

+0

@Tomaltach évite de bloquer les appels dans leur ensemble. Le déplacer vers la réponse ne fait aucune différence. il est toujours un appel de blocage – Nkosi

Répondre

2

Vous confondez async/et vous attendent de blocage des appels .Result

public async Task<string> GET(string uri) { 
    //...other code removed for brevity 

    var response = Client.GetAsync(fullUri).Result; 

    //...other code removed for brevity 
} 

qui est à l'origine d'un blocage résultant en vous de ne pas être en mesure d'obtenir à la prise. Lorsque vous utilisez async/await, vous devez effectuer une synchronisation asynchrone et éviter de bloquer des appels comme .Result et .Wait().

public async Task<string> GET(string uri) { 
    try { 
     Client.BaseAddress = new Uri(BASE_URI); 
     Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     var fullUri = String.Format("api/{0}/{1}", Controller, uri); 
     var response = await Client.GetAsync(fullUri); 
     var content = await response.Content.ReadAsStringAsync(); 
     return content; 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

Désolé pour le mélanger avec les lignes de code. Avait essayé quelques façons avant que j'ai posté le code ici et il s'est mélangé un peu. Je l'ai réparé maintenant mais cela échoue toujours à cause des prises. – Tomaltach

+0

@Tomaltach, Parce que vous utilisez toujours l'appel bloquant. Débarrassez-vous de '.Result'. Cela provoque le blocage. – Nkosi

+0

@Tomaltach cela a-t-il résolu le problème? – Nkosi