使用MVC5 WebAPI使用Web服务 - 无法连接到服务

时间:2014-02-28 21:21:42

标签: asp.net-mvc json web-services asp.net-web-api

所以我尝试连接到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"}

我尝试了几个不同的网址,它们都在浏览器中运行,没有一个在我的程序中运行,所以我一定错过了什么?

1 个答案:

答案 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);
    }
}