2014-02-28 116 views
1

所以我試圖連接到一個Web服務來檢索JSON並將其顯示到我的視圖。但是任何時候我運行代碼,我收到一個錯誤說:與MVC5消費Web服務WebAPI - 無法連接到服務

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

正如我已經建立了這個以下的教程和非常新的網絡API,我沒有想法爲什麼它會拋出一個錯誤。

想法?

我發現很少很好的教程展示瞭如何使用webAPI2簡單的web服務,因爲它是一個新概念。我也找不到爲什麼我會得到這個錯誤。

編輯:

忘了提,我運行在本地主機上這個項目,不知道這是相關的。

編輯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"} 

我試過幾個不同的URL,他們都跑在b rowser和沒有運行在我的程序,所以我必須錯過什麼?

+0

你會得到什麼異常? –

+0

@JeremyHolovacs增加了例外。我不能爲我的生活弄清楚,我也嘗試了幾種不同的連接方式,並且每次都得到相同的錯誤。顯然,我想做的事情是我不明白的。 – Blunderfest

回答

1

如果你看看來自iTunes的響應標題,你可以看到內容類型不是application/json它是text/javascript

剛剛自己運行你的代碼,我不相信當你訪問響應時拋出異常。當您嘗試閱讀響應主體時,它會拋出,因爲內置的媒體類型格式化程序不支持text/javascript

您可以將不支持的媒體類型添加到JsonMediaTypeFormatter,或者(也許更簡單的選項),您可以只讀取響應主體作爲字符串,然後自己執行JSON反序列化。

此外,異步/等待是你的朋友。你會發現它使異步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); 
    } 
} 
+0

雖然這不是原來的問題,但只要我解決了超時錯誤,您對類型錯誤是正確的。超時錯誤是由於網絡保護髮生的,因爲Visual Studio的某些實例不能使用網絡憑證運行。感謝你的回答! – Blunderfest

+0

@Malcoda - 你是如何解決超時的原始問題的?我在MVC5應用程序中看到一個非常類似的東西。相同的請求/響應代碼在控制檯應用程序中正常工作。 – Ron

+0

我安裝了Fiddler來調試一些問題,現在只要我嘗試通過Visual Studio連接到Web服務,我必須讓Fiddler打開並運行。 – Blunderfest