Passage d’objects complexes dans un service de repos WCF

J’ai un contrat d’opération qui accepte un object complexe et j’appelle l’opération via jQuery. Comment puis-je passer dans un object de type complexe comme ça en utilisant jQuery. Ci-dessous la signature de l’opération:

public Resolution CreateNewResolution(Resolution NewResolution); 

Je dois transmettre un object de résolution sur le client, mais je ne sais pas comment utiliser jQuery. De l’aide?

Je vous remercie

Voir le post de Denny pour un début, bien que je ne sois pas d’accord avec son utilisation de GET et en passant JSON dans la chaîne de requête pour les parameters complexes. Cela semble vraiment faux.


Le paramètre que vous utilisez pour les data est la représentation JSON de votre type de résolution. Par exemple, supposons que le type et l’opération soient définis comme suit côté serveur:

 [DataContract( Namespace = "urn:brandon.michael.hunter/ws/2010/01", Name = "Resolution" )] public class Resolution { [DataMember( IsRequired = true, Name = "Name" )] public ssortingng Name { get; set; } [DataMember( IsRequired = true, Name = "Rank" )] public int Rank { get; set; } [DataMember( IsRequired = true, Name = "SerialNumber" )] public int SerialNumber { get; set; } [DataMember( IsRequired = false, Name = "Id" )] public int Id { get; set; } } [OperationContract] [WebInvoke(Method = "PUT", RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "new")] public Resolution CreateNewResolution(Resolution r) { // your logic here r.Id = System.Guid.NewGuid(); return r; } 

Ensuite, en Javascript, le code que vous utilisez peut ressembler à ceci:

 var resolution = {r: { Name : "Fred", Rank : 2, SerialNumber : 17268 }}; // convert object to JSON ssortingng (See http://jollytoad.googlepages.com/json.js) var objectAsJson = $.toJSON(resolution); // result is a ssortingng: '{"Name":"Fred","Rank":"2","SerialNumber":"17268"}' $.ajax({ type : "PUT", // must match Method in WebInvoke contentType : "application/json", url : "Service.svc/new", // must match UriTemplate in WebInvoke data : objectAsJson, dataFilter : function (data, type) { // convert from "\/Date(nnnn)\/" to "new Date(nnnn)" return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1'); }, processData : false, // do not convert outbound data to ssortingng (already done) success : function(msg){ ... }, error : function(xhr, textStatus, errorThrown){ ... } }); 

Remarques:

  • Vous devez avoir le nom de la variable (r) pour être le premier object du JSON transmis, au moins avec WCF 4. Lorsque j’ai utilisé l’exemple précédent, cela n’a pas fonctionné tant que je n’ai pas entré le nom du fichier. variable au début.
  • Pour passer des objects complexes en JSON, utilisez PUT ou POST comme type (méthode HTTP) de la demande.
  • vous devez convertir l’object complexe en chaîne JSON. Il y a un joli petit plugin jquery pour le faire . Denny fournit sa propre implémentation.
  • J’ai constaté que si j’utilisais processData=true , la chaîne résultante envoyée au service est au format chaîne de requête, pas au format JSON. Pas ce que je veux pour passer des objects complexes. Alors je l’ai mis à faux. L’utilisation de true conviendrait pour les requêtes plus simples non JSON pour lesquelles vous exécutez WebGet et où tous les parameters sont dans la chaîne de requête.
  • le dataFilter permet une désérialisation correcte des objects DateTime
  • le msg transmis au rappel de réussite contient le JSON renvoyé.
  • Vous souhaiterez peut-être utiliser un enregistreur d’URL pour masquer cette balise .svc dans l’URL de la demande
  • dans ce cas, le service WCF utilise le comportement webHttp, pas enableWebScript. Ce dernier génère dynamicment des proxys Javascript pour invoquer le service, mais la façon dont vous avez posé la question donne l’impression que vous ne le souhaitez pas.

Consultez le blog de Gil Fink concernant la combinaison des services de données WCF, JSONP et jQuery

http://blogs.microsoft.co.il/blogs/gilf/archive/2011/04/24/combining-wcf-data-services-jsonp-and-jquery.aspx

Au cours de la session de Mike Flasko à MIX11, il a montré comment créer un service de données WCF prenant en charge JSONP avec un atsortingbut JSONPSupportBehavior disponible au téléchargement depuis la galerie de codes MSDN (et censé faire partie de l’espace de noms Microsoft.Data.Services.Extensions). Dans cet article, je vais vous montrer un exemple simple qui utilise l’atsortingbut et jQuery afin de faire un appel interdomaine JSONP pour un service de données WCF.

Mise en place de l’environnement

J’ai d’abord créé deux applications Web ASP.NET différentes. La première application comprend la page d’appel et la seconde comprend le service de données WCF. Ensuite, j’ai créé dans la deuxième application Web un modèle Entity Framework et le service de données WCF à partir de ce modèle. J’ai également ajouté la classe JSONPSupportBehavior.cs qui existe dans le lien fourni précédemment. La classe inclut l’implémentation de JSONPSupportBehavior qui implémente l’interface WCF IDispatchMessageInspector. En outre, il inclut le JSONPSupportBehaviorAtsortingbute que j’utilise dans mon code. Le code est simple et ressemble à:

 [JSONPSupportBehavior] public class SchoolDataService : DataService { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } 

Faire l’appel JSONP

Dans la deuxième application Web, j’ai créé un formulaire Web contenant l’exemple d’appel JSONP. Voici le code qui effectue l’appel:

    JSONP Call    

Permet d’explorer le code du formulaire Web: Au début, j’utilise Microsoft CDN afin de récupérer la bibliothèque jQuery. Ensuite, j’ai créé un élément de sortie HTML5 afin de lui append le résultat de l’appel. Dans le script principal, j’utilise la fonction getJSON de jQuery, qui appelle le service de données WCF. Notez que pour obtenir une réponse JSON du service de données WCF, vous devez utiliser le paramètre chaîne de requête $ format = json. Après avoir récupéré les données, je parcours et crée un élément div pour chaque titre de cours récupéré. Cela se fait dans la fonction success que j’ai câblée dans l’appel de la fonction getJSON. Voici le résultat de l’exécution du code:

entrez la description de l'image ici

Résumé

Dans le post, j’ai fourni un exemple simple de création d’un appel JSONP vers un service de données WCF à l’aide de jQuery. Ce type de solution peut vous aider à utiliser les services de données WCF existant dans d’autres domaines de votre côté client. Dans un article postérieur, je montrerai le même exemple en utilisant la nouvelle bibliothèque datajs