2015-06-30 9 views
8

Voglio creare un'applicazione web API per connettere xamarin con Android.
Ho provato molto, ma alcuni errori di connessione stanno arrivando.Xamarin: connettersi al servizio Web ospitato localmente

Il mio codice è il seguente:

public async Task<JsonValue> find(int ID) 
    { 
    using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://localhost:49836"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      HttpResponseMessage result = client.GetAsync("api/Product").Result; 
      return JsonConvert.DeserializeObject<JsonValue>(await result.Content.ReadAsStringAsync());     
    }  
    } 
    } 

I 'm ottenere l'errore come di seguito

System.Net.WebException: Error: ConnectFailure (Connection refused) ---> System.Net.Sockets.SocketException: Connection refused

Può uno aiuto. Qualsiasi aiuto è apprezzato.

+0

Sembra che questo non ha nulla a che fare con il codice, l'indirizzo stai cercando di raggiungere; 'http: // localhost: 49836' non è raggiungibile. Sei sicuro che la porta sia corretta? Un server sta ascoltando? Il firewall lascia passare il traffico? Cosa vedi quando digiti quell'indirizzo nel tuo browser? –

+0

possibile duplicato di [Connetti a localhost dal dispositivo Android] (http://stackoverflow.com/questions/10309049/connect-to-localhost-from-android-device) – user1

+1

"localhost" si riferisce al DISPOSITIVO su cui si sta eseguendo. Se si desidera connettersi a un altro sistema, è necessario utilizzare il proprio IP o nome univoco, non localhost. – Jason

risposta

2

Ho risolto il problema di come scaricare dati dal server tramite asp.net web api e per iniziare consiglio il modo semplice.

Prova ad utilizzare l'indirizzo completo es.

Verificare di avere la connessione dati attivata.

Assicurarsi di avere il percorso corretto (ad esempio quando si accende il wifi, che passa attraverso il server su cui si esegue WebAPI, quindi non l'indirizzo completo, ma l'indirizzo di un server locale).

è semplice codice che in esecuzione nel mio caso (a partire da semplici e poi andare dopo)

using (WebClient webClient = new WebClient()) 
      { 
       webClient.Encoding = System.Text.Encoding.UTF8; 
       string result = webClient.DownloadString(new Uri("https://webapi.domain.cz/api/root"));    
      } 
+0

in questo momento ho un altro problema: - result = {StatusCode: 400, Motivo della ragione: 'Bad Request', Versione: 1.1, Contenuto: System. Net.Http.StreamContent, Intestazioni: { Server: Microsoft-HTTPAPI/2.0 Data: Mer, 01 Jul 2015 05:57:12 GMT Connessione: chiudi Content-Type: text/html; charset = us-ascii Content-Lengt ... –

+0

Verificare che la richiesta di dati di input sia corretta. Per esempio. se hai dati json di quanti non puoi: Content-Type: text/html. Di solito provo prima a interrogare il server in un Fiddler2 e quando ho il giusto formato e la risposta è OK, rispetto alla stessa query/url provare nell'applicazione di destinazione ... – Majkl

+0

btw, Se la mia risposta alla tua domanda è corretta/strumentale non dimenticare di contrassegnarlo come risposta. – Majkl

18

Si noti che, se i vostri servizi web è ospitato da IIS Express, allora si dovrebbe sapere non è possibile connettersi a IIS Express da dispositivi esterni, perché inerentemente IIS Express rispondeva solo alla richiesta del computer locale. Quindi, da emulatori Android come dispositivi esterni (virtuali), non possiamo inviare richieste a IIS Express. La soluzione è utilizzare IIS anziché IIS Express.

  1. Utilizzare IIS o configurare IIS Express per eseguire il servizio su richieste esterne.
  2. In Android Emulator non è possibile utilizzare 'localhost', perché 'localhost' è loopback e si riferisce all'emulatore Android. Invece devi indirizzare il tuo servizio web usando l'IP di IIS.
  3. Configura firewall del sistema, per consentire le richieste http di entrare.
+6

@Ehsad Mirsaeedi Vorrei che avessi dato una risposta più completa su come fare esattamente ognuna di queste cose in modo che tutti potessero usarla. –

0

Ho risolto questo problema utilizzando l'indirizzo IP non utilizzare localhost