2014-06-15 9 views
7

Ich versuche, eine kleine Testanwendung mit WebApi zu schreiben. Ich habe es meistens funktioniert, ich bin in der Lage, Daten von meinem Web-Service zu bekommen und es in Android anzuzeigen.Ausnahme Aufruf von PutAsJsonAsync von Xamarin

habe ich eine Taste, und verwenden den gleichen Code, den ich in meinem Winforms Test-Client benutzt hatte:

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"; 
     } 
    } 

Dies funktioniert in der Windows Forms-Test-App, aber in der Xamarin App erhalte ich eine Ausnahme on client.PutAsJsonAsync:

E/mono-rt (7519): [FEHLER] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Der 'System.Net.Http.ObjectContent`1 [T]' aus Assembly konnte nicht geladen werden System.Net.Http.Formatting, Version = 5.1.0.0, Kultur = neutral, PublicKeyToken = 31bf3856ad364e35 '.

Irgendwelche Vorschläge? Xamarin Mit 3.

edit:

Es funktioniert, wenn ich manuell den Inhalt formatieren:

 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); 

Ich habe alle Referenzen korrekt, soweit ich sehen kann. Ich habe das WebApi Client nugget Paket verwendet. Referenzen

:

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

ich das gleiche Problem haben, aber mit 'PostAsAsync()', haben Sie in der Lage gewesen, es zu lösen? – markmnl

+0

@ markmnl: Es scheint mit der Verfügbarkeit von HttpClient PCL-Bibliotheken verwandt zu sein. Haben Sie dies überprüft: http://stackoverflow.com/questions/21844262/httpclient-missing-from-net-portable-subset-while-creating-pcl-in-xamarin –

+0

@marceln Ich bin mir nicht sicher, dass das Problem ist - Ich kann die Lib gut sehen - ich benutze den HttpClient aus dem NuGet-Paket für die PCL - alles kompiliert und es schlägt nur bei Android nach dem Ausführen der 'PostAsJsonAsync()' Methode fehl ... Die Workaround des OP funktioniert für mich in die Zwischenzeit, obwohl ich jetzt bekommen Netzwerk ist unerreichbar, aber das ist ein anderes Problem – markmnl

Antwort

0

Die Überlastliste für die System.Net.Http.PutAsJsonAsync Methode auf MSDN zeigt nur Überlastungen, die drei oder vier Parameter enthalten. In Ihrem Beispiel sehe ich zwei, die Sie passieren. Es scheint richtig zu sein, den Parameter HttpClient wegzulassen, wenn er als eine Instanz von HttpClient basierend auf den Codebeispielen von MSDN aufgerufen wird.

Allerdings wurde es mit Xamarin als eine Gabel von MonoDevelop gebaut. MonoDevelop verwendet das Mono Framework, das ein Port des .NET Frameworks ist. Aufgrund dieses Unterschieds interessiert mich, ob ein Bug für Mono, MonoDevelop oder Xamarin geöffnet werden soll.

Zurück zur Liste der Überladungsmethoden, empfehle ich jedoch, eine dieser Überladungen zu verwenden.

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

ich die HttpClient zum PutAsJsonAsync Verfahren ohne PutAsJsonAsync wird von einer Instanz von HttpClient genannt passieren empfehlen zu versuchen.

BTW, dies ist keine garantierte Lösung, denn es war einfach zu viel Informationen in Kommentare zu setzen. Hoffe das hilft.

1

Sie müssen die folgenden Nuget Pakete für alle Projekte installieren, die Ihr Projekt Httpclient

  1. Microsoft.Bcl verweisen.Bauen
  2. Microsoft.Bcl

Dies sind die Warnungen von Visual Studio, wenn ich mein Projekt gebaut und nachdem ich das getan, es hat funktioniert!

1

serialisiert Ihre Daten in eine JSON-String wie folgt aus:

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