2012-03-25 18 views
12

Ho creato un metodo utilizzando le nuove funzionalità WebAPI in MVC4 e l'ho eseguito su Azure. Il metodo richiede la pubblicazione di un oggetto LoginModel semplice costituito da una proprietà Username e Password. Sì, ho intenzione di garantire questo ulteriore una volta che ottengo passato questo speed bump :-) Il metodo risponde poi con un oggetto in formato JSON:Chiamare i metodi MVC4 WebAPI dal client UI Metro C# utilizzando PostAsync, HttpClient e Json

enter image description here

posso chiamare con successo questo metodo che utilizza Fiddler, a condizione che includere "Content-Type: application/json" nelle intestazioni di richiesta. Si ritorna con 200 e posso andare in ispettore Violinista e visualizzare l'oggetto risposta JSON bene:

enter image description here

Sono comunque ad avere problemi chiamando lo stesso metodo da un'applicazione MetroUI in Windows8 utilizzando C#/XAML. Ho iniziato a giocare con HttpClient e i nuovi concetti Async in C# e non importa come ho formattato le mie chiamate Post (anche quando richiama esplicitamente che voglio che Content-Type sia "application/json") Fiddler ritorna con un errore 500 e afferma che il tentativo stava usando Content-Type: "text/html". Ho beleive che questa sia la radice del problema:

enter image description here

Ho provato tutto immaginabile al fine di inviare a questo metodo e tornare l'oggetto JSON, ecco il mio tentativo più recente:

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

Il risultato è un errore 500 con Content-Type impostato su "text/html"

Qui è stato un altro tentativo che ha anche fallito:

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

Qualcuno può indicarmi la giusta direzione?

appena provato il seguente codice grazie ai consigli di 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(); 

E ora mostra "application/json" nella mia richiesta di intestazione, ma ancora mostra "text/html" nella sessione Web:

enter image description here

risposta

22

Prova questo per impostare il Headers.ContentType:

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

Grazie Nemesv. Ho appena provato e non riesco ancora a superare l'errore 500, ma noto che in Fiddler l'intestazione mostra che sta usando "application/json" - tuttavia la sessione web per il record mostra "text/html" I'll allegare una presa sullo schermo. – CodeAbundance

+1

FYI: vedi gli aggiornamenti in fondo al mio post originale. E grazie per il tuo aiuto! – CodeAbundance

+0

FYI: Penso che sia il modo in cui sto impostando i parametri nella mia intestazione di contenuto. Ho inserito un punto nel codice e ho attraversato l'oggetto HttpContent dopo aver impostato i valori StringContent e non ho trovato gli elementi Username o Password. Conosci un metodo migliore per pubblicarlo su WebAPI? Sto ancora esaminando la mia fine ... – CodeAbundance

6

Manca qualche prova, funziona.

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

Questo è meglio, serializzare l'oggetto con JSON.Net invece di creare manualmente un dizionario JsonObject (che è un codice non necessario e si interromperà non appena l'entità cambia). Nell'RTM è anche possibile utilizzare il costruttore di StringContent per specificare il tipo di supporto e la codifica, ad esempio UTF8, ad es. var content = new StringContent (json, Encoding.UTF8, "application/json"). –

+1

sì, grazie al suo lavoro per me .. – andy

Problemi correlati