2012-03-25 11 views
12

Ich habe eine Methode erstellt, die die neuen WebAPI-Funktionen in MVC4 verwendet und sie auf Azure ausführen lässt. Die Methode erfordert, dass Sie ein einfaches LoginModel-Objekt veröffentlichen, das aus einer Username- und einer Password-Eigenschaft besteht. Ja, ich plane, auf der Sicherung diesen weiter, sobald ich an dieser Geschwindigkeit Beule bekommen :-) Das Verfahren schreitet dann mit einem Objekt im JSON-Format antwortet:Aufruf von MVC4-WebAPI-Methoden aus C# Metro-UI-Client mit PostAsync, HttpClient und JSON

enter image description here

ich erfolgreich mit dieser Methode Fiddler nennen kann, dass ich zur Verfügung gestellt Fügen Sie in den Request Headers "Content-Type: application/json" ein. Es gibt mit 200 und ich kann das Fiddler Inspektor gehen und die gerade fein Json Antwort Objekt:

enter image description here

ich aber habe Probleme das gleiche Verfahren von einem MetroUI App in Windows8 Aufruf C#/XAML verwenden. Ich fing an, mit dem HttpClient und den neuen Async-Konzepten in C# herumzuspielen und egal, wie ich meine Post-Aufrufe formatierte (selbst wenn ich explizit anrufe, dass der Inhaltstyp "application/json" sein soll), kehrt Fiddler mit einem Fehler von 500 zurück und gibt an, dass der Versuch Content-Type verwendet: "text/html". Ich glaube, dies ist die Wurzel des Problems zu sein:

enter image description here

ich alles versucht habe, denkbar, um diese Methode zu schreiben und das JSON-Objekt zurück, hier ist mein letzter Versuch:

HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}"); 

     client.PostAsync("http://myapi.com/authentication", content).ContinueWith(result => 
     { 
      var response = result.Result; 

      response.EnsureSuccessStatusCode(); 
     }); 

Dies führt zu einem 500-Fehler mit Content-Type auf "text/html" gesetzt

Hier war ein weiterer Versuch, die auch fehlgeschlagen:

HttpClient httpClient = new HttpClient(); 
HttpResponseMessage response = await httpClient.PostAsync("http://myapi.com/authentication", new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}", Encoding.UTF8, "application/json")); 
string statusCode = response.StatusCode.ToString(); 

Kann mir jemand in die richtige Richtung zeigen?

versucht einfach den folgenden Code dank der Beratung von Nemesv:

HttpClient httpClient = new HttpClient(); 
     HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}"); 
     content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 


     HttpResponseMessage response = await httpClient.PostAsync("http://webapi.com/authentication", content); 

     string statusCode = response.StatusCode.ToString(); 
     response.EnsureSuccessStatusCode(); 

Es ist nun "application/json" in meinem Request-Header zeigt, zeigt aber noch "text/html" in der Web-Session:

enter image description here

Antwort

22

diese versuchen, die Headers.ContentType einzustellen:

HttpClient httpClient = new HttpClient(); 
HttpContent content = new StringContent(@"{ ""Username"": """ + "etc." + @"""}"); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
HttpResponseMessage response = 
    await httpClient.PostAsync("http://myapi.com/authentication", content); 
string statusCode = response.StatusCode.ToString(); 
+0

Danke Nemesv. Ich habe es einfach ausprobiert und bin immer noch nicht in der Lage, den Fehler 500 zu bekommen, aber ich merke, dass in Fiddler der Header zeigt, dass er "application/json" verwendet - aber die Web-Session für den Datensatz zeigt "text/html" Befestigen Sie einen Bildschirm greifen. – CodeAbundance

+1

FYI: Siehe Updates am Ende meines ursprünglichen Beitrags. Und danke für deine Hilfe! – CodeAbundance

+0

FYI: Ich denke, es ist die Art, wie ich die Parameter in meinem Content-Header setze. Ich habe den Code gestoppt und das HttpContent-Objekt durchlaufen, nachdem ich die StringContent-Werte festgelegt und die Elemente Benutzername oder Kennwort nicht gefunden habe. Kennen Sie eine bessere Methode, um dies in der WebAPI zu veröffentlichen? Ich schaue immer noch auf mein Ende ... – CodeAbundance

6

Es gibt einige fehlende versuchen, das funktioniert.

UserLoginModel user = new UserLoginModel { Login = "username", Password = "password" }; 
string json = Newtonsoft.Json.JsonConvert.SerializeObject(user); 
HttpContent content = new StringContent(json); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost:1066/api/"); 
HttpResponseMessage response = client.PostAsync("Authenticate", content).Result; 

if (response.IsSuccessStatusCode) 
{ 
    var result = response.Content.ReadAsAsync<ResultModel>().Result; 
} 
else 
{ 
    return string.Empty; 
} 
+0

Dies ist besser, wenn Sie das Objekt mit JSON.Net serialisieren, anstatt manuell ein JsonObject-Wörterbuch zu erstellen (was ein unnötiger Code ist und brechen würde, sobald sich die Entität ändert). In der RTM können Sie auch den Konstruktor von StringContent verwenden, um den Medientyp und die Codierung anzugeben, nehmen Sie beispielsweise UTF8, z. var content = new StringContent (json, Encoding.UTF8, "application/json"). –

+1

ja, danke, dass es für mich funktioniert .. – andy

Verwandte Themen