Mise à JOUR 10/19/2010 Je sais que j'ai posé cette question il y a longtemps, mais les solutions de contournement indiqué dans la réponse à ces questions ne sont guère satisfaisantes, et c'est toujours un problème commun pour beaucoup. WCF n'est pas flexible. J'ai commencé ma propre open source C# bibliothèque pour la création de services REST sans WCF. Vérifier restcake.net ou rest.codeplex.com pour info sur ladite bibliothèque. MISE À JOUR DE FIN
Mise à JOUR 8/2/2012 ASP.NET l'API Web (précédemment Web WCF API, le remplacement pour le RESTE de la WCF) utilise Json.NET par défaut MISE À JOUR DE FIN
L' DataContractJsonSerializer
est incapable de gérer de nombreux scénarios Json.Net poignées juste d'amende lorsqu'il est correctement configuré (en particulier, les cycles).
Une méthode de service peut renvoyer un type d'objet spécifique (dans ce cas, un DTO), auquel cas l' DataContractJsonSerializer
sera utilisé, ou je peux avoir la méthode renvoie une chaîne de caractères, et de faire de la sérialisation moi-même avec Json.Net. Le problème est que quand je retourne une chaîne json, par opposition à un objet, le json qui est envoyé au client est enveloppé dans des guillemets.
À l'aide de DataContractJsonSerializer
, en retournant un type d'objet spécifique, la réponse est:{"Message":"Hello World"}
À l'aide de Json.Net pour retourner une chaîne json, la réponse est:"{\"Message\":\"Hello World\"}"
Je ne veux pas avoir à eval() ou JSON.parse() le résultat sur le client, qui est ce que j'aurais à faire si le json revient comme une chaîne de caractères, enveloppé dans les citations. Je me rends compte que le comportement est correct, c'est juste pas ce que j'ai envie/besoin. J'ai besoin de la crue json; le comportement lorsque la méthode de service de type de retour est un objet, pas une chaîne de caractères.
Alors, comment puis-je avoir ma méthode retourne un objet de type, mais de ne pas utiliser le DataContractJsonSerializer? Comment puis-je lui dire d'utiliser le Json.Net sérialiseur à la place?
Ou, est-il d'une certaine manière d'écrire directement le flux de réponse? Si je peux juste de retour de la crue json moi-même? Sans l'emballage d'un devis?
Voici mon exemple artificiel, pour référence:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")]
public SimpleMessage SayHelloObject()
{
return new SimpleMessage("Hello World");
}
// uses Json.Net serialization, to return a json string
// returns "{\"Message\":\"Hello World\"}"
[WebGet(UriTemplate = "helloString")]
public string SayHelloString()
{
SimpleMessage message = new SimpleMessage() { Message = "Hello World" };
string json = JsonConvert.Serialize(message);
return json;
}
// I need a mix of the two. Return an object type, but use the Json.Net serializer.
}