所以我尝试连接到Web服务以检索JSON并将其显示到我的View。但是,无论何时运行代码,我都会收到错误消息:
"Unable to connect to the remote server."
当我在浏览器中导航到Web服务URL时,它会按照预期的方式显示JSON字符串。
我的控制器类Tweets.cs:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TwitterClientMVC.Controllers
{
public class Tweets
{
public Tweet[] results;
}
public class Tweet
{
[JsonProperty("atristName")]
public string Artist { get; set; }
[JsonProperty("trackName")]
public string TrackName { get; set; }
}
}
我的HomeController.cs类:
public class HomeController : Controller
{
public ActionResult Index()
{
Tweets model = null;
var client = new HttpClient();
var task = client.GetAsync("http://itunes.apple.com/search?term=metallica")
.ContinueWith((taskwithresponse) =>
{
try
{
**var response = taskwithresponse.Result;** Fails here
var readtask = response.Content.ReadAsAsync<Tweets>();
readtask.Wait();
model = readtask.Result;
}
catch (AggregateException e)
{
e.ToString();
}
});
task.Wait();
return View(model.results);
}
由于我已经在教程之后构建了这个并且对于web api来说是一个新手,我不知道它为什么会抛出错误。
想法?
我发现很少有很好的教程展示如何使用webAPI2来使用简单的web服务,因为它是一个新概念。我也无法找到为什么会收到此错误。
编辑:
忘记提到我在localhost上运行这个项目,不确定这是否相关。
编辑2:
确切的例外:
{"An error occurred while sending the request."}
的InnerException:
{"Unable to connect to the remote server"}
的InnerException:
{"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 23.3.162.217:80"}
我尝试了几个不同的网址,它们都在浏览器中运行,没有一个在我的程序中运行,所以我一定错过了什么?
答案 0 :(得分:1)
如果您查看来自iTunes的回复标题,您可以看到内容类型不是application/json
text/javascript
。
刚刚运行您的代码我不相信访问响应时会抛出异常。当您尝试阅读响应正文时它会抛出,因为内置媒体类型格式化程序不支持text/javascript
。
您可以将不受支持的媒体类型添加到JsonMediaTypeFormatter
或(可能更简单的选项),您只需将响应正文作为字符串读取,然后自己执行JSON反序列化。
另外,async / await是你的朋友。您会发现它使得使用异步API变得更加容易:
public async Task<ActionResult> Index()
{
using (var client = new HttpClient())
{
var response = await client.GetAsync("http://itunes.apple.com/search?term=metallica");
var json = await response.Content.ReadAsStringAsync();
var tweets = JsonConvert.DeserializeObject<Tweets>(json);
return View(tweets);
}
}