2012-07-24 50 views
1

我正在嘗試構建一個GET web服務,它將從網站1發起一個GET請求...將該請求發送到網站2,網站2將通過發送對象列表進行響應。我使用Json.net序列化和反序列化對象列表。MVC 3 GET Webservice和Response

我已經把一個POST Web服務這個問題的幫助.. WebService ASP.NET MVC 3 Send and Receive

但我一直不成功迄今爲止在適應我的新的要求,即例子。

以下是我從網站1到目前爲止..

public static List<ScientificFocusArea> ScientificFocusAreas() 
    { 
     string apiURL = "http://localhost:50328/Api/GetAPI"; 

     //Make the post 
     ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true; 

     //var bytes = Encoding.Default.GetBytes(body); 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiURL); 
     Stream stream = null; 
     try 
     { 
      request.KeepAlive = false; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.Timeout = -1; 
      request.Method = "GET"; 
     } 
     finally 
     { 
      if (stream != null) 
      { 
       stream.Flush(); 
       stream.Close(); 
      } 
     } 

     List<ScientificFocusArea> listSFA = WebService.GetResponse_ScientificFocusArea(request); 

     return listSFA; 
    } 

    public static List<ScientificFocusArea> GetResponse_ScientificFocusArea(HttpWebRequest request) 
    { 
     List<ScientificFocusArea> listSFA = new List<ScientificFocusArea>(); 

     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 

      using (Stream responseStream = response.GetResponseStream()) 
      { 
       if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created) 
       { 
        throw new HttpException((int)response.StatusCode, response.StatusDescription); 
       } 

       var end = string.Empty; 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        end = reader.ReadToEnd(); 
        reader.Close(); 

        listSFA = JsonConvert.DeserializeObject<List<ScientificFocusArea>>(end); 
       } 

       response.Close(); 
      } 
     } 

     return listSFA; 
    } 

然後網站2 ...

public class GetAPIController : Controller 
{ 
    // 
    // GET: /Api/GetAPI/ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetScientificFocusAreas() 
    { 
     //Get list of SFAs 
     List<ScientificFocusArea> ListSFA = CreateList.ScientificFocusArea(); 

     string json = JsonConvert.SerializeObject(ListSFA, Formatting.Indented); 

     //Send the the seralized object. 
     return Json(json); 

    } 

} 

此外,在網站2,我已經註冊了這個路線對於傳入的請求...

 context.MapRoute(
"GetScientificFocusAreas", 
"Api/GetAPI/", 
new 
{ 
    controller = "GetAPI", 
    action = "GetScientificFocusAreas", 
    id = UrlParameter.Optional 
} 

);

我目前正在收到錯誤..他遠程服務器返回錯誤:(404)未找到。

任何幫助,我將不勝感激。

回答

0

該問題看起來像一個路由問題。我會從RouteDebugger開始,它可以找到here。該工具可以深入瞭解您的網址觸發了哪些路線。

我用於HTTP GET的代碼與上面的代碼有點不同。它包含在下面。

public T Get<T>(string url) 
    { 
     try 
     { 
      HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 

      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created) 
       { 
        throw new HttpException((int)response.StatusCode, response.StatusDescription); 
       } 

       var end = string.Empty; 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        end = reader.ReadToEnd(); 
        reader.Close(); 
       } 

       responseStream.Close(); 
       response.Close(); 

       JsonSerializer serializer = new JsonSerializer(); 
       serializer.Binder = new DefaultSerializationBinder(); 
       JsonReader jsonReader = new JsonTextReader(new StringReader(end)); 
       T deserialize = serializer.Deserialize<T>(jsonReader); 

       return deserialize; 
      } 

     } 
     catch (Exception ex) 
     { 
      throw new ApiException(string.Format("An error occured while trying to contact the API. URL: {0}", url), ex); 
     } 
    } 

我看到的另一個問題是在GetScientificFocusAreas()方法。在代碼的第二行,對象被轉換爲JSON。這很好,但最後一行代碼json被傳入Json()方法。它再次將字符串轉換爲Json。當使用JSON.Net庫使用在return代替Json()Content()方法和內容類型設置爲應用/ JSON

使用外部的Json轉換器而不是內部轉換器的原因是簡單地將內部JSON轉換器有一些已知的問題。 JSON.Net已經存在多年,並且穩定。

+0

我想實現你的建議,並在這一行上有一個錯誤... serializer.Binder = new DefaultSerializationBinder();我是否缺少命名空間或類?使用System; using System.Collections.Generic; using System.Web;使用System.Web.Routing的 ; using System.Web.Mvc;使用System.IO的 ;使用System.Collections的 ;使用System.Net的 ; 使用System.Text; 使用Newtonsoft.Json; – 2012-07-26 13:27:29

+0

忽略我最後的評論查克,我能夠得到它的工作。 serializer.Binder = new DefaultSerializationBinder(); – 2012-07-26 15:16:13

+1

非常感謝您的幫助Chuck! – 2012-07-26 15:17:13