che io chiamo un servizio esterno utilizzando HttpClient all'interno di un progetto di Api 4 Web ASP.Net MVC in esecuzione su .Net Framework 4.5Calling servizio HTTP esterno utilizzando HttpClient da un'azione Web API
Il codice di esempio è la seguente (ignorare i valori di ritorno in quanto questo è il codice di esempio per testare chiamare un servizio esterno):
public class ValuesController : ApiController
{
static string _address = "http://api.worldbank.org/countries?format=json";
private string result;
// GET api/values
public IEnumerable<string> Get()
{
GetResponse();
return new string[] { result, "value2" };
}
private async void GetResponse()
{
var client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(_address);
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
}
Mentre il codice nel metodo privato effettivamente funziona il problema che ho è che il Get controller() chiama il GetResponse() ma non è in attesa del risultato, ma esegue immediatamente il risultato con result = null.
Ho anche provato ad utilizzare una chiamata sincrona più semplice con un WebClient come segue:
// GET api/values
public IEnumerable<string> Get()
{
//GetResponse();
var client = new WebClient();
result = client.DownloadString(_address);
return new string[] { result, "value2" };
}
che funziona bene.
Cosa sto sbagliando? Perché Get() non attende il completamento del metodo privato nel campione asincrono?
non è necessario richiamare GetResponse() anche con attendere? Altrimenti, questo non aspetterà che il metodo finisca ... e l'azione del controller finirà direttamente lasciando il risultato essere ancora nullo. – jishi
Sì, ma non mi ero reso conto che potevo contrassegnare Get() come asincrono che è necessario per l'attesa. – Redeemed1