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
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:
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:
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:
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
FYI: vedi gli aggiornamenti in fondo al mio post originale. E grazie per il tuo aiuto! – CodeAbundance
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