使用VS 2010,VB.NET,HTTPClient,.NET 4.0和Windows窗体。
我正在尝试让Windows应用程序使用来自我创建的Web API的JSON。 Web API运行良好,我可以从浏览器查看结果。发现这篇文章我一直试图只使用VB.NET而不是C#。 http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-wpf-application
代码的关键部分是这个功能:
private void GetProducts(object sender, RoutedEventArgs e)
{
btnGetProducts.IsEnabled = false;
client.GetAsync("api/products/2").ContinueWith((t) =>
{
if (t.IsFaulted)
{
MessageBox.Show(t.Exception.Message);
btnGetProducts.IsEnabled = true;
}
else
{
var response = t.Result;
if (response.IsSuccessStatusCode)
{
response.Content.ReadAsAsync<IEnumerable<Product>>().
ContinueWith(t2 =>
{
if (t2.IsFaulted)
{
MessageBox.Show(t2.Exception.Message);
btnGetProducts.IsEnabled = true;
}
else
{
var products = t2.Result;
_products.CopyFrom(products);
btnGetProducts.IsEnabled = true;
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
我试图将其转换为VB.NET,但我遇到了t.Result的问题,说''结果'不是'System.Threading.Tasks.Task'的成员。“
这是我尝试将其转换为VB.NET:
Private Sub GetProducts(sender As Object, e As RoutedEventArgs)
btnGetProducts.IsEnabled = False
client.GetAsync("api/products/2") _
.ContinueWith(Of HttpResponseMessage) _
(Function(t)
If t.IsFaulted Then
MessageBox.Show(t.Exception.Message)
btnGetProducts.IsEnabled = True
Else
'***************************************************************
Dim response = t.Result 'This is the line that is giving me grief. Error Msg: 'Result' is not a member of 'System.Threading.Tasks.Task'.
'***************************************************************
If response.IsSuccessStatusCode Then
response.Content.ReadAsAsync(Of IEnumerable(Of SendNotice)).ContinueWith _
(Function(t2)
If t2.IsFaulted Then
MessageBox.Show(t2.Exception.Message)
btnGetProducts.IsEnabled = True
Else
Dim products = t2.Result
_lstSN.CopyFrom(products)
btnGetProducts.IsEnabled = True
End If
End Function, TaskScheduler.FromCurrentSynchronizationContext())
End If
End If
End Function, TaskScheduler.FromCurrentSynchronizationContext())
End Sub
知道我为什么会收到此错误以及我在代码中缺少什么以便能够捕获返回的JSON数据?
谢谢!
答案 0 :(得分:6)
这是因为VB.NET类型推断在Visual Studio 2010中并不是很好。您需要通过指定{{1>返回的实际类型为编译器提供一些额外的帮助。像这样:
client.GetAsync()
注意:我已将您的功能更改为Sub,因为我没有看到任何Return语句。
答案 1 :(得分:0)
试试这个:
client.GetAsync("api/products/2") _
.ContinueWith(Sub(t)
If t.IsFaulted Then
.
.
.
答案 2 :(得分:-1)
尝试将lambda从Function更改为Sub。