2014-06-15 26 views
7

Sto provando a scrivere una piccola applicazione di test utilizzando WebApi. Per lo più lavoro, sono in grado di ottenere dati dal mio servizio web e visualizzarli su Android.Eccezione chiamata PutAsJsonAsync da Xamarin

ho aggiunto un pulsante, e utilizzato lo stesso codice che avevo usato nel mio WinForms client di prova:

async void buttonSave_Clicked(object sender, EventArgs e) 
    { 
     HttpClient client = new HttpClient(); 
     Customer data = new Customer() { 
     Surname = editSurname.Text, 
     GivenName = editGivenName.Text}; 

     var result = await client.PutAsJsonAsync("http://10.0.0.4/WebApplication1/api/Customers/2", data); 
     if (result.IsSuccessStatusCode) { 
     labelStatus.Text = "Saved"; 
     } 
    } 

Questo funziona bene in Windows Form Test App, ma in app Xamarin ottengo un'eccezione on client.PutAsJsonAsync:

E/mono-rt (7519): [ERRORE] irreversibile non gestita: System.TypeLoadException: Impossibile caricare il tipo 'System.Net.Http.ObjectContent`1 [T]' dall'assembly ' System.Net.Http.Formatting, Version = 5.1.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 '.

Qualche suggerimento? Utilizzando Xamarin 3.

edit:

Funziona se formatto il contenuto manualmente:

 string sData = Newtonsoft.Json.JsonConvert.SerializeObject(data); 

     HttpContent content = new System.Net.Http.StringContent(sData, System.Text.Encoding.UTF8, "application/json") ; 
     var result = await client.PutAsync("http://10.0.0.4/WebApplication1/api/Customers/2",content); 

Ho tutti i riferimenti corretti, per quanto posso vedere. Ho usato il pacchetto nuget del client WebApi.

Riferimenti:

Newtonsoft.Json 
System.Net.Http 
System.Net.Http.Extensions 
System.Net.Http.Formatting 
System.Net.Http.Primitives 
+0

Ho lo stesso problema, ma con 'PostAsAsync()', sei stato in grado di risolverlo? – markmnl

+0

@markmnl: Sembra essere correlato alla disponibilità delle librerie PCL HttpClient. Hai controllato: http://stackoverflow.com/questions/21844262/httpclient-missing-from-net-portable-subset-while-creating-pcl-in-xamarin –

+0

@marceln Non sono sicuro che questo sia il problema - Riesco a vedere la lib fine - sto usando HttpClient dal pacchetto NuGet per il PCL - tutto si compila e fallisce solo quando si esegue su Android dopo aver eseguito il metodo 'PostAsJsonAsync()' ... La soluzione del PO funziona per me in l'interim anche se ora sto ottenendo rete è irraggiungibile, ma questo è un altro problema – markmnl

risposta

0

L'elenco sovraccarico per il metodo System.Net.Http.PutAsJsonAsync su MSDN mostra solo sovraccarichi che contengono tre o quattro parametri. Nel tuo esempio, ne vedo due che stai passando. Sembra corretto poter escludere il parametro HttpClient quando viene chiamato come istanza da HttpClient in base agli esempi di codice da MSDN.

Tuttavia, con Xamarin è stato costruito come un fork di MonoDevelop. MonoDevelop usa il Mono Framework che è una porta di .NET Framework. A causa di questa differenza, sono interessato se un bug dovrebbe essere aperto per Mono, MonoDevelop o Xamarin.

Torna all'elenco dei metodi di sovraccarico, tuttavia, si consiglia di provare a utilizzare uno di questi sovraccarichi.

  • PutAsJsonAsync (HttpClient, String, T)
  • PutAsJsonAsync (HttpClient, Uri, T)
  • PutAsJsonAsync (HttpClient, String, T, CancellationToken)
  • PutAsJsonAsync (HttpClient, Uri, T, CancellationToken)

Vi consiglio cercando di passare il HttpClient al metodo PutAsJsonAsync senza PutAsJsonAsync essere chiamati da un'istanza di HttpClient.

BTW, questa non è una soluzione garantita, perché era semplicemente troppe informazioni da inserire nei commenti. Spero che questo ti aiuti.

1

È necessario installare i seguenti pacchetti Nuget a tutti i progetti che fanno riferimento il vostro progetto HttpClient

  1. Microsoft.Bcl.Costruire
  2. Microsoft.Bcl

Questi sono gli avvertimenti da Visual Studio quando ho costruito il mio progetto e dopo che ho fatto, ha funzionato!

1

serializzare i dati in una stringa JSON come questo:

string json = JsonConvert.SerializeObject(item); 
        var content = new StringContent(json, Encoding.UTF8, "application/json"); 
        HttpResponseMessage response = null; 
        response = await client.PostAsync(url, content); 
Problemi correlati