2016-06-14 42 views
1

我从这里采取了以下代码:http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client如何知道为什么HttpClient调用不返回?

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://localhost:9000/"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    // New code: 
    HttpResponseMessage response = await client.GetAsync("api/products/1"); 
    if (response.IsSuccessStatusCode) 
    { 
     Product product = await response.Content.ReadAsAsync>Product>(); 
     Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category); 
    } 
} 

我已经更新了BaseAddress和标题URL部分矿井。完整的URL通过浏览器按预期工作。

当我使用下面的代码时,调用是从Web API应用程序进行并返回的。我可以看到这一点,因为Web API应用程序正在调试模式下运行。但在这条线后,来电方没有任何反应:

HttpResponseMessage response = await client.GetAsync("api/products/1"); 

该应用似乎冻结。用户界面无响应。我确实在try/catch块中有这样的代码,但它没有遇到异常。

有没有办法找出发生了什么?

的应用程序被称为是这样的:

class Program 
{ 
    static void Main() 
    { 
     RunAsync().Wait(); 
    } 

    static async Task RunAsync() 
    { 
     using (var client = new HttpClient()) 
     { 
      // TODO - Send HTTP requests 
     } 
    } 
} 
+0

你如何调用执行此代码的方法?我会怀疑由于使用'.Wait()'或'.Result'造成的死锁。 –

+1

你试过小提琴手吗? – Legends

+0

我更新了OP – 4thSpace

回答

1

的应用程序似乎冻结。用户界面无响应。

这是一个winforms应用程序 - MDI表单应用程序。为什么这与从控制台应用程序调用有什么不同?

您正在看到我在博客上完整解释的common deadlock issue。总之,默认情况下,await将捕获一个“上下文”,并使用它来恢复方法async。在UI线程中,该“上下文”是UI SynchronizationContext,因此await之后的代码将在该UI线程上恢复。 (在控制台应用程序中,没有“上下文”,因此await之后的代码将在线程池线程上恢复)。

问题是调用代码正在调用Task.Wait()。这将的UI线程,直到Task完成。但是,Task表示执行async方法,并且该方法在UI线程空闲之前无法完成。因此,僵局。

相关问题