2010-10-24 3 views
1

BonjourStructure Comprendre Json générée par un service WCF AJAX

Dans Visual Studio 2010, je suis en mesure d'ajouter à ma solution un nouvel élément appelé à service WCF AJAX. Cela va ajouter un nouveau fichier .svc.

Plus tard, je l'ai créé une méthode juste pour des fins de débogage:

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class DataAccessService 
{ 
    [WebGet] 
    [OperationContract] 
    public MyClass DoWork() 
    { 
     var o = new MyClass 
     { 
      Id = 1, 
      FirstName = "Junior", 
      LastName = "Mayhe" 
     }; 
     return o; 
    } 
} 

Lorsque le débogage est la chaîne JSON résultante ici:

{"d": 
    {"__type":"MyClass:#MyProject", 
    "Id":1, 
    "FirstName":"Junior", 
    "LastName":"Mayhe" 
    } 
} 

La question est, quel est ce "d"? Est-ce un code de type de résultat pour une chaîne JSON, et si oui, existe-t-il d'autres codes?

merci à l'avance

Répondre

1

Il est seulement "d", et il est prévu comme protection contre certaines attaques de script intersite.

E.g. considérez une méthode qui renvoie un tableau int de données sensibles (par exemple, les soldes de comptes bancaires). Il peut être retourné comme:

[10000,12300,15000] 

Ou:

{"d":[10000,12300,15000]} 

Le problème est que dans le premier cas, il y a un (très avancé et obscur mais néanmoins réel) attaque où un autre site peut voler ces données en incluant un appel au service dans une balise et en remplaçant le constructeur du tableau JavaScript. L'attaque n'est pas possible si le JSON ressemble à ce dernier cas.

Il y avait des discussions au sein de Microsoft pour étendre le format au-delà de "d", mais je ne pense pas qu'il soit allé n'importe où.

+0

oui, cela semble être une sorte d'enveloppe. pour obtenir ceci au format nu, j'ai dû ajouter '[BodyStyle = WebMessageBodyStyle.Bare)]' et changer la balise web.config '' en ' ' –

0

Votre réponse est tout simplement s'encapsulés avec un objet parent appelé « d ». Il a été introduit dans les services Web ASP.NET 3.5 en tant qu'amélioration de la sécurité pour empêcher le détournement JSON. Les proxys clients générés pour votre service supprimeront le "d", de sorte que vous ne saurez jamais vraiment où il se trouvait. Mais puisque votre service ne va pas vraiment être consommé pour autre chose que des requêtes AJAX, vous devrez accéder à vos objets JSON via la propriété ".d". Je recommande d'utiliser JSON2 pour analyser la réponse, car tous les navigateurs n'ont pas de support JSON natif au moment de cette écriture.

Vous pouvez en lire un peu plus sur le problème de sécurité here.