web-dev-qa-db-ger.com

Aufrufen eines externen HTTP-Dienstes mithilfe von HttpClient über eine Web-API-Aktion

Ich rufe einen externen Dienst mit HttpClient in einem ASP.Net MVC 4 Web Api-Projekt an, das unter .Net Framework 4.5 ausgeführt wird

Der Beispielcode lautet wie folgt (ignorieren Sie die Rückgabewerte, da dies Beispielcode ist, um zu testen, ob ein externer Dienst aufgerufen werden soll):

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

Während der Code in der privaten Methode tatsächlich funktioniert, besteht das Problem, das ich habe, darin, dass der Controller Get () GetResponse () aufruft, das Ergebnis jedoch nicht abwartet, sondern die Rückgabe sofort mit result = null ausführt.

Ich habe auch versucht, einen einfacheren synchronen Aufruf mit einem WebClient wie folgt zu verwenden:

 // GET api/values
    public IEnumerable<string> Get()
    {
        //GetResponse();

        var client = new WebClient();

        result = client.DownloadString(_address);

        return new string[] { result, "value2" };
    }

das funktioniert gut.

Was mache ich falsch? Warum erwartet Get () nicht den Abschluss der privaten Methode im asynchronen Beispiel?

21
Redeemed1

Aha, ich musste Folgendes tun (eine Aufgabe zurückgeben und nicht mehr gültig):

 // GET api/values
    public async Task<IEnumerable<string>> Get()
    {
        var result = await GetExternalResponse();

        return new string[] { result, "value2" };
    }

    private async Task<string> GetExternalResponse()
    {
        var client = new HttpClient();
        HttpResponseMessage response = await client.GetAsync(_address);
        response.EnsureSuccessStatusCode();
        var result = await response.Content.ReadAsStringAsync();
        return result;
    }

Ich wusste auch nicht, dass ich die Get () - Operation als asynchron kennzeichnen konnte, was mir erlaubte, auf den externen Anruf zu warten.

Danke an Stephen Cleary für seinen Blog-Beitrag Async und Await der mich in die richtige Richtung weist.

34
Redeemed1

Rufen Sie mit dem Benutzernamen und dem Kennwort Httpclient auf. Im Falle einer API-Authentifizierung.

    public async Task<ActionResult> Index()
{

            const string uri = "https://testdoamin.zendesk.com/api/v2/users.json?role[]=agent";
            using (var client1 = new HttpClient())
            {
                var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("[email protected]:123456")));///username:password for auth
                client1.DefaultRequestHeaders.Authorization = header;
               var aa = JsonConvert.DeserializeObject<dynamic>(await client1.GetStringAsync(uri));

            }
}
0
Karan Singh