2016-05-04 167 views
1

我想从Windows服务调用Rest API。我从来没有尝试过。我不知道为什么我不能打这个电话。如何从Windows服务调用REST API

我的代码:

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的 AR)

被上下面的行生成此错误:

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

任何意见,将不胜感激。

编辑:(更新后的代码)

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

编辑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

嘿,SOZ我错过了聊天请求早些时候,听起来像你到达那里,我通常挂在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; 

...或更紧凑的版本可能会使用ac ontinuation像这样...

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

...这会做的请求,那么当请求回来asyncronously解析它为你展开任务返回“内的结果”,因为这代码创建一个任务>>而你只是想IEnumerable等待解包任务得到你的结果2个任务正在执行一个接一个:)

...我看着你的具体代码,并在一个新的控制台应用程序运行,请更新它对此...

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