2016-05-04 4 views
1

Я пытаюсь вызвать Rest API из службы Windows. Я никогда этого не делал. Я не уверен, почему я не могу сделать этот звонок.Как вызвать REST API из службы Windows

Мой код:

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

Я получаю следующее сообщение об ошибке:

  • сообщение: Произошла ошибка при отправке запроса.

  • Внутренняя Сообщение исключения: { "Базовое соединение закрыто:. соединение было закрыто неожиданно"}

  • Внутренний трассировки стека исключений на System.Net.HttpWebRequest.EndGetResponse (IAsyncResult AsyncResult)
    на System.Net.Http.HttpClientHandler.GetResponseCallback (IAsyncResult ар)

Эта ошибка генерируется на следующей строке:

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

Любые предложения будут оценены.

EDIT: (Обновлено код)

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: (все еще получаю ту же ошибку)

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

Эй, Соз я пропустил запрос чата раньше, звучит, как вы получаете там, я обычно тусуюсь в C# чатов, если вам нужна дополнительная помощь по этому вопросу, поп в HTTP: //. Чат .stackoverflow.com/rooms/7/c – War

ответ

1

Ваша проблема в том, что ...

var response = client.GetAsync(urlParameter); 

. .. возвращает задание, которое вам нужно дождаться, пока оно закончится.

Чистейшая способ сделать этот вызов, как это ...

var response = await client.GetAsync(urlParameter); 

... это требует код запуска в методе асинхронным, как это ...

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

. .. или вы можете просто сказать компилятору ждать, используя ...

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

var response = task.Result; 

... или более компактный вариант может быть использование переменного тока ontinuation как это ...

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

... это будет делать запрос тогда, когда запрос возвращается асинхронном разобрать его для вас и разворачивания задачу возвращает «внутренний результат», как этот код создает задачу >> и вы просто хотите, чтобы IEnumerable так долго ожидал, что развернутая задача получит результат двух заданий, выполняемых один за другим :)

... Я посмотрел ваш конкретный код и запустил его в новом консольном приложении, пожалуйста, обновите его к этому ...

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

Спасибо за объяснение, однако я все равно получаю ту же ошибку. В этом случае я отправил маршрут task.Wait(), и именно там он создал ту же ошибку. Я действительно подтвердил этот API, я смог назвать его через ajax в отдельном проекте. Однако я не могу выполнить этот вызов со службы Windows. – PrivateJoker

+0

Хммм ... нормально, если бы вы могли обновить код в своем вопросе, возможно, с помощью редактирования, которое показывает, что задача используется правильно, а затем детали нового исключения, которые я могу вам помочь, но его трудно сказать, не видя фактического кода вы застряли. Я знаю, что мой ответ работает так, как я все время это делаю. – War

+0

Обновленный код по запросу – PrivateJoker

Смежные вопросы