2010-11-07 9 views
1

J'ai mon MVC2 RESTFul webservice prêt à accepter JSON et revenir un peu en utilisant un exemple que je trouve hereFaire correcte JSON Poster sur C# pour MVC 2 REST webservice

Good stuff, ce exemple fonctionne très bien l'affichage de la JSON via jQuery, et la manipulation de la réponse JSON:

 $(function() { 
     $("#personCreate").click(function() { 
      var person = getPerson(); 

      // poor man's validation 
      if (person == null) { 
       alert("Specify a name please!"); 
       return; 
      } 

      var json = $.toJSON(person); 

      $.ajax({ 
       url: '/home/save', 
       type: 'POST', 
       dataType: 'json', 
       data: json, 
       contentType: 'application/json; charset=utf-8', 
       success: function (data) { 
        // get the result and do some magic with it 
        var message = data.Message; 
        $("#resultMessage").html(message); 
       } 
      }); 
     }); 
    }); 

Cependant, je dois appeler mon webservice automatiquement (un serveur d'appeler un autre, pas côté client jQuery ici). Donc, je fais tout cela en C#:

private static void MakeJSONServiceCall(PersonInputModel person) 
    { 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServiceUrl); 
      request.Method = "POST"; 
      request.ContentType = "application/json; charset:utf-8"; 
      DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      ser.WriteObject(ms, person); 
      String json = Encoding.UTF8.GetString(ms.ToArray()); 
      StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
      writer.Write(json); 
      writer.Close(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 

Excep, lorsque le DataContractJsonSerializer sérialise mon objet que je reçois des ordures avec un tas de balises échappées:

"{\"<Age>k__BackingField\":24,\"<Name>k__BackingField\":\"Jordan\"}" 

ne ressemble pas bon JSON à moi !?

fixe:

"{\"Age\":24,\"Name\":\"Jordan\"}" 

La classe, est bien decordated:

[Serializable] 
public class PersonInputModel { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

fixe:

[DataContract] 
public class PersonInputModel { 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public int Age { get; set; } 
} 

Et que quand je lance le webservice, et mis dans l'URL, il Je ne suis jamais touché même lorsque je traverse ce code.

Qu'est-ce qui me manque?

Merci!


Un examen plus approfondi à l'aide Fiddler, je ne vois pas un "POST" qui aura lieu du tout comme je l'étape par:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServiceUrl); 
     request.Method = "POST"; 
     request.ContentType = "application/json; charset:utf-8"; 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     ser.WriteObject(ms, person); 
     String json = Encoding.UTF8.GetString(ms.ToArray()); 
     StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
     writer.Write(json); 
     writer.Close(); 

pensées?

Répondre

2

Vous devez utiliser le DataContract attributes:

[DataContract] 
public class PersonInputModel { 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public int Age { get; set; } 
} 

Votre code existant est sérialisation la classe champs d'accompagnement générés par le compilateur, qui ont des noms inattendus.

+0

Merci pour le rappel Je reviens avec mes résultats –

+0

Cela a amélioré la mise en forme de la chaîne JSON - "{\" Age \ ": 24, \" Name \ ": \" Jordan \ "}", semble assez solide , les guillemets sont échappés, ce qui est bien dans le débogueur et je suppose que c'est correct. –

+0

Je ne suis toujours pas au service quand je cours le code avec un point d'arrêt sur le service d'attente ?! J'ai vérifié pour m'assurer que mon URL est correcte. –