2016-05-04 15 views
1

Ich versuche, eine Rest-API über einen Windows-Dienst aufzurufen. Ich habe das noch nie zuvor versucht. Ich bin mir nicht sicher, warum ich diesen Anruf nicht machen kann.So rufen Sie eine REST-API über einen Windows-Dienst auf

Mein Code:

string urlParameter = "posts/1"; 
    var client = new HttpClient(); 
    client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/"); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    HttpResponseMessage response = client.GetAsync(urlParameter).Result; 
    if (response.IsSuccessStatusCode) 
    { 
     var dataObj = response.Content.ReadAsAsync<IEnumerable<MyType>>().Result; 
    } 

ich die folgende Störung erhalte:

  • Nachricht: Fehler beim Senden der Anforderung.

  • Inner Ausnahmemeldung: { "Die zugrunde liegende Verbindung wurde geschlossen:. Die Verbindung unerwartet geschlossen wurde"}

  • Ausnahme-Stack-Trace bei System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
    bei System.Net.Http.HttpClientHandler.GetResponseCallback (IAsyncResult ar)

Dieser Fehler wird in der folgenden Zeile erzeugt:

HttpResponseMessage response = client.GetAsync(urlParameter).Result; 

Irgendwelche Vorschläge würden geschätzt.

EDIT: (Stand-Code)

string urlParameter = "posts/1"; 
    var client = new HttpClient(); 
    client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/"); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    try 
    { 
     //var response = await client.GetAsync(urlParameter); 
     var task = client.GetAsync(urlParameter); 
     task.Wait(); 
     var response = task.Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var dataObj = response.Content.ReadAsAsync<IEnumerable<MyType>>().Result; 
     } 
    } 
    catch (Exception ex) 
    { 
     string a = ex.Message; 
     string b = ex.ToString(); 
    } 

EDIT 2: (immer noch die gleichen Fehler)

private static async void TestAPI2() 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Add("Get", "application/json"); 

     var response = await client.GetAsync("http://jsonplaceholder.typicode.com/posts/1"); 

     string context = await response.Content.ReadAsStringAsync(); 

    } 
} 
+0

Hey, soz ich die Chat-Anfrage früher verpasst haben, klingt wie Sie es immer, ich in der Regel in der C# Chat-Raum hängen, wenn Sie mehr Hilfe zu diesem Thema benötigen, pop in http:. // Chat .stackoverflow.com/rooms/7/c – War

Antwort

1

Ihr Problem ist, dass ...

var response = client.GetAsync(urlParameter); 

. .. gibt eine Aufgabe zurück, auf die Sie warten müssen, damit sie zuerst beendet wird.

Der sauberste Weg, um diesen Anruf zu machen, ist so ...

var response = await client.GetAsync(urlParameter); 

... dies erfordert der Code in einer Asynchron-Methode wie folgt ...

public async Task Foo() 
{ 
    var response = await client.GetAsync(urlParameter); 
} 

ausgeführt werden. .. oder Sie können einfach den Compiler sagen, mit warten ...

var task = client.GetAsync(urlParameter); 
task.Wait(); 

var response = task.Result; 

... oder eine kompaktere Version könnte sein ac zu verwenden ontinuation so ...

var result = await client.GetAsync(urlParameter) 
    .ContinueWith(t => t.Result.Content.ReadAsAsync<IEnumerable<MyType>>()) 
    .Unwrap(); 

... dies dann die Anforderung tun wird, wenn die Anforderung asynchron analysiert es kommt wieder für Sie und die Aufgabe Auswickeln gibt das „inneres Ergebnis“, wie dieser Code eine Aufgabe erstellt >> und Sie wollen nur das IEnumerable warten auf die unverpackte Aufgabe erhalten Sie das Ergebnis von 2 Aufgaben nacheinander ausgeführt werden :)

... Ich sah Ihren spezifischen Code und lief das in einer neuen Konsole App, bitte aktualisieren Sie es zu diesem ...

class MyType 
     { 
      public int userId { get; set; } 
      public int id { get; set; } 
      public string title { get; set; } 
      public string body { get; set; } 
     } 

     static void TestAnApiCall() 
     { 
      string urlParameter = "posts/1"; 
      var client = new HttpClient(); 
      client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/"); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      try 
      { 
       //var response = await client.GetAsync(urlParameter); 
       var task = client.GetAsync(urlParameter); 
       task.Wait(); 
       var response = task.Result; 

       if (response.IsSuccessStatusCode) 
       { 
        var readTask = response.Content.ReadAsAsync<MyType>(); 
        readTask.Wait(); 
        var dataObj = readTask.Result; 
        Console.WriteLine(JsonConvert.SerializeObject(dataObj)); 
       } 
      } 
      catch (Exception ex) 
      { 
       string a = ex.Message; 
       string b = ex.ToString(); 
      } 
     } 
+0

Danke für die Erklärung, aber ich bekomme immer noch den gleichen Fehler. In diesem Fall bin ich die task.Wait() Route gegangen, und das ist, wo es den gleichen Fehler erzeugt. Ich habe diese API validiert, ich konnte sie über Ajax in einem separaten Projekt aufrufen. Ich kann diesen Anruf jedoch nicht von meinem Windows-Dienst aus tätigen. – PrivateJoker

+0

Hmmm ... ok, wenn Sie den Code in Ihrer Frage vielleicht mit einer Bearbeitung aktualisieren könnten, die die verwendete Aufgabe korrekt anzeigt, dann sollten Details der neuen Ausnahme Ihnen helfen können, aber es ist schwer zu sagen ohne den eigentlichen Code zu sehen Du bist festgefahren. Ich weiß, dass meine Antwort funktioniert, weil ich die ganze Zeit so etwas mache. – War

+0

Aktualisiert Code wie angefordert – PrivateJoker

Verwandte Themen