2012-07-24 3 views
1

Je tente de créer un service Web GET qui, à partir du site Web 1, déclencherait une requête GET ... l'envoi de cette requête au site Web 2 et le site Web deux répondraient en envoyant une liste d'objets. J'utilise Json.net pour sérialiser et désérialiser la liste d'objets.MVC 3 GET Webservice et réponse

J'ai mis en place un webservice POST avec l'aide de cette question .. WebService ASP.NET MVC 3 Send and Receive

Mais je suis échoué jusqu'à présent à adapter cet exemple pour ma nouvelle exigence.

Voici ce que j'ai jusqu'à présent sur le site 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; 
    } 

ensuite sur le site 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); 

    } 

} 

En outre, sur le site 2, je me suis inscrit dans cette voie pour la demande entrante ...

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

);

Je reçois actuellement l'erreur .. Le serveur distant a renvoyé une erreur: (404) Introuvable.

Toute aide me serait grandement appréciée.

Répondre

0

Le problème semble être un problème de routage. Je voudrais commencer par le RouteDebugger qui peut être trouvé here. Cet outil donne un aperçu des routes que votre URL atteint.

Le code que j'utilise pour un HTTP GET est un peu différent de ce que vous avez ci-dessus. C'est inclus ci-dessous.

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

L'autre problème que je vois est dans la méthode GetScientificFocusAreas(). Sur la deuxième ligne du code, les objets sont convertis en JSON. Ce qui est bien, mais la dernière ligne de code le json est passé dans la méthode Json(). Ce qui convertit la chaîne en JSON encore une fois. Lorsque vous utilisez la bibliothèque JSON.Net utiliser la méthode Content() dans la return au lieu de Json() et définir le type de contenu à l'application /JSON

Le raisonnement pour l'utilisation d'un convertisseur JSON externe plutôt que le convertisseur interne est tout simplement le JSON interne Le convertisseur a quelques problèmes connus. JSON.Net a été autour depuis des années et est solide.

+0

J'essaie d'implémenter votre suggestion et il y a une erreur sur cette ligne ... serializer.Binder = new DefaultSerializationBinder(); Est-ce que je manque un espace de noms ou une classe? Using System; en utilisant System.Collections.Generic; en utilisant System.Web; en utilisant System.Web.Routing; en utilisant System.Web.Mvc; en utilisant System.IO; en utilisant System.Collections; en utilisant System.Net; en utilisant System.Text; en utilisant Newtonsoft.Json; –

+0

Ignorer mon dernier commentaire Chuck, j'ai réussi à le faire fonctionner. serializer.Binder = new DefaultSerializationBinder(); –

+1

Merci beaucoup pour votre aide Chuck! –